跨站脚本攻击(XSS)详解
字数 1352 2025-11-05 23:48:06
跨站脚本攻击(XSS)详解
描述
跨站脚本攻击(XSS)是一种常见于Web应用的安全漏洞,攻击者通过注入恶意脚本到可信的网页中,当用户访问该页面时,脚本在浏览器执行,从而窃取Cookie、会话令牌或实施其他恶意操作。XSS的核心在于Web应用未对用户输入进行充分过滤或转义,导致恶意内容被浏览器解析为代码。根据攻击方式,XSS主要分为三类:反射型、存储型和DOM型。
解题过程
-
理解XSS攻击的基本原理
- 正常Web交互:用户输入数据→服务器处理→返回响应(数据仅作为内容显示)。
- XSS攻击流程:攻击者构造恶意输入(如
<script>alert('XSS')</script>)→服务器未过滤直接返回→浏览器将输入解析为可执行脚本→脚本在受害者浏览器中运行。 - 危害示例:窃取用户Cookie、重定向到钓鱼页面、键盘记录等。
-
区分三类XSS攻击的特点
- 反射型XSS:
- 恶意脚本作为请求参数发送到服务器,服务器立即将其嵌入返回页面(如搜索结果显示)。攻击常通过钓鱼链接诱导用户点击。
- 示例:用户访问
http://site.com/search?q=<script>stealCookie()</script>,页面直接显示输入内容时触发脚本。
- 存储型XSS:
- 恶意脚本被永久存储到服务器(如评论区、数据库),任何用户访问包含该内容的页面时都会触发。危害更持久。
- 示例:攻击者在论坛发布含恶意脚本的帖子,其他用户浏览帖子时脚本自动执行。
- DOM型XSS:
- 攻击不经过服务器,由前端JavaScript直接操作DOM时引入(如
document.write(location.hash))。 - 示例:用户访问
http://site.com#<img src=x onerror=alert(1)>,页面JS将哈希值写入DOM触发攻击。
- 攻击不经过服务器,由前端JavaScript直接操作DOM时引入(如
- 反射型XSS:
-
防御XSS的关键措施
- 输入验证与过滤:
- 对用户输入进行严格校验(如长度、字符类型),拒绝非法内容(如
<script>标签)。 - 使用白名单机制,仅允许安全的HTML标签(如富文本编辑器需配置过滤规则)。
- 对用户输入进行严格校验(如长度、字符类型),拒绝非法内容(如
- 输出转义:
- 将数据嵌入HTML前,对特殊字符(如
<,>,&,")进行转义(如<转为<)。 - 不同上下文需不同转义规则:
- HTML内容:使用
htmlspecialchars()等函数。 - HTML属性:转义引号和括号。
- JavaScript代码:避免直接嵌入数据,改用
JSON.stringify。
- HTML内容:使用
- 将数据嵌入HTML前,对特殊字符(如
- 内容安全策略(CSP):
- 通过HTTP头
Content-Security-Policy限制脚本来源,如只允许同域脚本:Content-Security-Policy: default-src 'self' - 可有效阻止内联脚本和外部恶意资源加载。
- 通过HTTP头
- 其他辅助措施:
- 设置Cookie的
HttpOnly属性,防止通过document.cookie窃取。 - 对富文本内容使用沙箱机制(如
iframe sandbox)。
- 设置Cookie的
- 输入验证与过滤:
-
实战示例:修复一个简单的XSS漏洞
- 漏洞代码(PHP示例):
echo "<div>欢迎," . $_GET['username'] . "!</div>"; // 直接输出未转义的用户输入 - 修复方案:
echo "<div>欢迎," . htmlspecialchars($_GET['username'], ENT_QUOTES, 'UTF-8') . "!</div>"; // 转义后,`<script>`会被显示为文本而非执行
- 漏洞代码(PHP示例):
总结
XSS防御核心在于“不信任用户输入”,需结合输入过滤、输出转义和CSP等多层防护。开发中应使用安全框架(如React自动转义)、定期进行安全测试(如渗透测试工具ZAP)以降低风险。