什么是 XSS 攻击?如何防御?

XSS 是一种常见的 Web 安全漏洞,通过恶意脚本窃取用户信息。本题详细讲解了 XSS 的三种类型及其防御方法。

前端安全 中等 安全 XSS Web安全

XSS 攻击,即 Cross-Site Scripting(跨站脚本攻击),是一种常见的 Web 安全漏洞。攻击者通过在目标网站上注入恶意脚本(通常是 JavaScript),当其他用户访问受影响的页面时,浏览器执行该脚本,可能导致用户数据泄露、会话劫持或页面篡改等。核心原理是 Web 应用的输入过滤不足,允许恶意脚本被浏览器解释执行。攻击主要分为三类:

  1. 反射型 XSS(非持久型):恶意脚本通过 URL 传递(如恶意链接),用户点击链接后服务器反射回脚本立即执行。通常为攻击者诱导用户点击。
  2. 存储型 XSS(持久型):恶意脚本存储在服务器数据库(如评论区或用户个人资料页),用户在访问页面时被动触发脚本执行,影响更广。
  3. DOM 型 XSS:攻击仅涉及前端脚本操作(如 innerHTML 修改),无需服务器响应,通常通过修改 DOM 来注入代码。

如何避免 XSS 攻击?

有效防御的核心原则是对所有用户输入和输出进行严格过滤和编码,具体措施包括:

  1. 输入编码和过滤
    • 编码特殊字符:服务器端将所有用户输入中的危险字符(如 <, >, &)转义为 HTML 实体(如 &lt;, &gt;, &amp;)。避免输入直接被解析为代码。
    • 使用安全库:如 Java 中可用 OWASP 的 Encode 库或前端的 DOMPurify 清理输入内容。示例代码(JavaScript 端):
      const cleanInput = DOMPurify.sanitize(userInput);
      
  2. 输出编码
    • 上下文相关编码:根据不同输出点(HTML 属性、文本、URL)采用相应编码机制。如在 React 中使用 dangerouslySetInnerHTML 前自动转义。
    • API 使用安全:避免使用危险 API(如 innerHTML),选用 textContent 代替。
      element.textContent = userContent;  // 安全  
      
  3. 启用内容安全策略(CSP)
    • 设置 HTTP 响应头限制浏览器仅执行可信源的脚本,阻断任意代码注入。例如:
      Content-Security-Policy: script-src 'self';
      
  4. 控制脚本执行环境
    • Cookies 安全处理:使用 HttpOnly 和 Secure 属性防止脚本通过 document.cookie 获取敏感数据。
    • DOM 操作审查:校验 URL 参数和用户操作,避免不安全的脚本插入。
      综合应用前端和后端策略(如服务端输入验证)能大幅降低风险。开发者需熟悉这些实践,确保应用安全测试覆盖所有功能输入点。