跨站脚本攻击
字数 2012
更新时间 2026-01-31 22:33:45
跨站脚本攻击
跨站脚本攻击是一种将恶意脚本注入到其他用户信任的网页中的攻击方式。要理解它,我们从其最基础的核心概念开始。
第一步:理解基本概念——“脚本”与“跨站”
- “脚本”在此特指Web浏览器能够理解并执行的代码,主要是JavaScript。浏览器加载网页时,会自动执行这些脚本。
- “跨站”指的是,恶意脚本并非来自当前用户直接访问的、可信的网站本身,而是攻击者通过某种方式“跨”过了站点的安全边界,将其“植入”到了这个可信的页面中。
- 核心危害在于,浏览器无法区分页面内的脚本是网站开发者编写的还是攻击者注入的,它会以网站的权限(如同源策略下)执行所有脚本。这使得攻击者能够“伪装”成受信任的网站,对访问该页面的用户发起攻击。
第二步:剖析攻击的基本原理与分类
攻击成功需要两个条件:一个存在漏洞的网站(能够注入脚本),以及一个访问了被注入页面的受害者用户。根据恶意脚本存储和触发的方式,主要分为两类:
-
反射型XSS:
- 过程:攻击者构造一个包含恶意脚本的URL,并通过邮件、即时消息等方式诱骗受害者点击。当受害者点击此链接时,恶意脚本作为请求的一部分(通常在URL参数中)发送给网站。网站在返回的页面中,未加处理就直接“反射”回这个脚本,并在受害者的浏览器中执行。
- 特点:恶意脚本并未存储在目标网站服务器上,是一次性的,仅对点击特定链接的用户生效。就像诱骗你点击一个伪造的查询链接,结果在结果页里执行了恶意代码。
-
存储型XSS:
- 过程:攻击者将恶意脚本提交到目标网站的服务器并保存下来(例如,写入数据库)。常见于论坛发帖、用户评论、昵称等所有用户能提交并持久化数据的地方。之后,任何其他普通用户浏览到包含该恶意数据的页面时,脚本都会被自动加载并执行。
- 特点:危害性更大,因为恶意脚本被永久存储在服务器上,所有访问相关页面的用户都会持续受影响。就像一个公共留言板上被涂写了恶意指令,所有看板的人都会中招。
第三步:了解恶意脚本能做什么(攻击载荷)
一旦脚本在用户浏览器中执行,它可以实施多种危害,例如:
- 窃取用户凭证:读取页面中的身份验证Cookie,并发送到攻击者控制的服务器,导致攻击者能直接登录受害者的账户。
- 会话劫持:在用户不知情的情况下,以其身份执行敏感操作,如转账、更改密码、发布信息。
- 按键记录与钓鱼:在页面中植入键盘记录器,或伪造一个登录框(钓鱼),诱使用户输入用户名、密码甚至银行卡信息。
- 破坏页面结构:篡改网页内容,插入不当信息或链接,进行网络破坏或传播恶意软件。
第四步:学习如何防范——开发者视角
防御的核心原则是:不信任任何用户输入,并对输出进行适当的处理。
- 输入验证与过滤:在服务器端,对用户提交的数据进行严格的校验。只允许符合特定规则的内容(如长度、字符类型)。但过滤往往不够,因为攻击方式千变万化。
- 输出编码/转义:这是最根本有效的措施。在将用户可控的数据输出到HTML页面时,必须根据其出现的上下文进行编码。
- HTML主体/属性上下文:将特殊字符(
<,>,",',&)转换为对应的HTML实体(如<变为<),这样浏览器会将其视为数据文本,而非可执行的代码。 - JavaScript上下文:对插入到
<script>标签内的用户数据进行严格的JavaScript编码。
- HTML主体/属性上下文:将特殊字符(
- 使用内容安全策略:这是一种深度防御策略。网站通过HTTP响应头
Content-Security-Policy告知浏览器,只允许执行来自特定可信来源的脚本,而禁止执行任何内联脚本(如<script>标签中的代码)和eval()函数。这能从根本上遏制大部分XSS攻击,即使恶意脚本被注入,也无法执行。 - 设置HttpOnly Cookie:为身份验证Cookie等重要Cookie设置
HttpOnly属性,可以阻止JavaScript通过document.cookieAPI读取它们,从而缓解Cookie被盗的风险。
第五步:补充进阶知识——其他类型与变体
- 基于DOM的XSS:这是一种特殊的反射型XSS。整个恶意脚本的注入和执行完全发生在客户端浏览器的DOM解析环境中,不经过服务器响应。例如,页面中的JavaScript代码(如
document.write、innerHTML、eval)如果直接使用了URL片段(如location.hash)等用户可控的数据,就可能被利用。其防御重点在于安全地编写客户端JavaScript代码。 - 自执行XSS:攻击者诱骗已登录网站的用户访问一个第三方网站,该第三方网站通过JavaScript向目标网站发起一个跨域请求(利用浏览器的同源策略),并携带恶意操作指令。防御方法通常包括使用CSRF令牌、验证请求来源等,但其根源也常涉及XSS的变种利用。