什么是 XSS 攻击?如何防御?
XSS 是一种常见的 Web 安全漏洞,通过恶意脚本窃取用户信息。本题详细讲解了 XSS 的三种类型及其防御方法。
XSS 攻击,即 Cross-Site Scripting(跨站脚本攻击),是一种常见的 Web 安全漏洞。攻击者通过在目标网站上注入恶意脚本(通常是 JavaScript),当其他用户访问受影响的页面时,浏览器执行该脚本,可能导致用户数据泄露、会话劫持或页面篡改等。核心原理是 Web 应用的输入过滤不足,允许恶意脚本被浏览器解释执行。攻击主要分为三类:
- 反射型 XSS(非持久型):恶意脚本通过 URL 传递(如恶意链接),用户点击链接后服务器反射回脚本立即执行。通常为攻击者诱导用户点击。
- 存储型 XSS(持久型):恶意脚本存储在服务器数据库(如评论区或用户个人资料页),用户在访问页面时被动触发脚本执行,影响更广。
- DOM 型 XSS:攻击仅涉及前端脚本操作(如
innerHTML
修改),无需服务器响应,通常通过修改 DOM 来注入代码。
如何避免 XSS 攻击?
有效防御的核心原则是对所有用户输入和输出进行严格过滤和编码,具体措施包括:
- 输入编码和过滤:
- 编码特殊字符:服务器端将所有用户输入中的危险字符(如
<
,>
,&
)转义为 HTML 实体(如<
,>
,&
)。避免输入直接被解析为代码。 - 使用安全库:如 Java 中可用 OWASP 的 Encode 库或前端的 DOMPurify 清理输入内容。示例代码(JavaScript 端):
const cleanInput = DOMPurify.sanitize(userInput);
- 编码特殊字符:服务器端将所有用户输入中的危险字符(如
- 输出编码:
- 上下文相关编码:根据不同输出点(HTML 属性、文本、URL)采用相应编码机制。如在 React 中使用
dangerouslySetInnerHTML
前自动转义。 - API 使用安全:避免使用危险 API(如
innerHTML
),选用textContent
代替。element.textContent = userContent; // 安全
- 上下文相关编码:根据不同输出点(HTML 属性、文本、URL)采用相应编码机制。如在 React 中使用
- 启用内容安全策略(CSP):
- 设置 HTTP 响应头限制浏览器仅执行可信源的脚本,阻断任意代码注入。例如:
Content-Security-Policy: script-src 'self';
- 设置 HTTP 响应头限制浏览器仅执行可信源的脚本,阻断任意代码注入。例如:
- 控制脚本执行环境:
- Cookies 安全处理:使用 HttpOnly 和 Secure 属性防止脚本通过 document.cookie 获取敏感数据。
- DOM 操作审查:校验 URL 参数和用户操作,避免不安全的脚本插入。
综合应用前端和后端策略(如服务端输入验证)能大幅降低风险。开发者需熟悉这些实践,确保应用安全测试覆盖所有功能输入点。