WEB安全 - 认识与防御XSS攻击

WEB安全 - 认识与防御XSS攻击
最新回答
念一份期待╮

2023-05-24 14:32:02

XSS(跨站脚本攻击)是一种通过向网页注入恶意脚本实现攻击的技术,其核心在于利用Web应用的漏洞执行非预期的脚本代码。防御XSS需从输入过滤、输出编码、安全配置等多层面综合施策。

一、XSS攻击的危害
  • 数据窃取:通过document.cookie获取用户敏感信息(如会话令牌)。
  • 页面篡改:利用JS/CSS破坏页面结构或样式,干扰正常交互。
  • 流量劫持:通过修改window.location.href重定向用户至恶意站点。
  • 拒绝服务(DoS):高频请求占用服务器资源,导致合法用户无法访问。
  • 身份冒用:以用户身份执行操作(如发消息、转账),甚至结合CSRF发起进一步攻击。
  • 数据操控:读取、篡改或删除企业敏感数据(如数据库记录)。
二、XSS攻击分类与示例1. 反射型XSS(非持久化)
  • 特点:通过URL参数或表单提交注入恶意代码,仅对当前用户生效。
  • 示例

    前端漏洞:攻击者构造链接

    http://xss-example.com/index.html?data=alert
    (document.cookie),若页面使用eval()解析参数,则触发攻击。

    后端漏洞:URL参数未经过滤直接返回前端,如

    http://xss-example.com/index.html?name=<script>alert
    (1)</script>,后端代码res.send(req.query.name)导致脚本执行。

2. 存储型XSS(持久化)
  • 特点:恶意代码存入数据库,所有访问该页面的用户均受影响。
  • 示例

    留言评论:攻击者在评论框输入<img src="null" onerror="alert(document.cookie)">,后端未过滤直接存储并展示,导致所有用户加载页面时触发攻击。

三、XSS攻击的核心步骤
  1. 漏洞分析:识别输入点(如URL参数、表单字段)和输出点(如页面渲染、AJAX响应)。
  2. 代码构建:编写恶意脚本(如<script>alert(1)</script>),并通过编码(如Unicode、URL编码)绕过简单过滤。
  3. 注入执行:将代码注入输入点,待输出点渲染时执行。例如:

    修改昵称时注入<div style="width:expression(alert('XSS'))">(针对IE7-)。

    通过<a onclick="alert(1)">绑定点击事件。

四、XSS防御策略1. 输入控制
  • 编码特殊字符:对<、>、&、'、"等符号进行HTML实体编码(如<转为&lt;)。
  • URL参数处理

    输出前使用URLEncode转义。

    输入时验证格式(如URL需符合正则表达式)。

  • 避免危险函数

    禁用eval()解析动态数据,改用JSON.parse()处理JSON。

    禁止直接执行用户输入的代码(如通过Function构造函数)。

2. 输出控制
  • 选择安全API

    原生JS:优先使用innerText(安全)而非innerHTML(危险)。

    jQuery:使用text()(安全)而非html()(危险)。

    模板引擎:如EJS中,用<%- %>转义输出,避免<%= %>直接渲染。

  • 上下文相关编码

    HTML内容:实体编码。

    JavaScript字符串:使用x转义。

    URL路径:百分号编码。

3. 安全配置
  • HTTP头设置

    HttpOnly:防止JS访问document.cookie(如Set-Cookie: id=a3fWa; HttpOnly)。

    X-XSS-Protection:启用浏览器内置防护(如X-XSS-Protection: 1; mode=block)。

    Content-Security-Policy (CSP):限制脚本加载源(如default-src 'self')。

  • 后端过滤

    对用户输入进行白名单过滤(如仅允许字母、数字)。

    使用库如DOMPurify净化HTML。

4. 防御工具推荐
  • 编码库:自定义函数或使用he库实现HTML实体编码。
  • 专业库

    OWASP ESAPI:提供输入验证、输出编码等安全接口。

    XSS Filter:自动检测并中和恶意脚本。

五、案例分析
  • 京东搜索功能:输入关键词后,返回结果通过转义处理,避免<script>等标签执行。
  • 知乎评论系统

    提交时:对输入内容进行编码(如<转为&lt;)。

    展示时:使用安全API渲染,防止脚本注入。

六、总结
  • 反射型XSS:依赖用户点击恶意链接,防御需严格过滤URL参数。
  • 存储型XSS:危害范围广,需结合输入编码、输出净化和数据库防护。
  • 核心原则永不信任用户输入,所有动态内容均需经过编码或过滤。通过分层防御(输入、输出、配置)可显著降低XSS风险。