XSS 全称是 Cross Site Scripting,为了与 CSS 作区分,所以简写为 XSS,表示跨站脚本攻击。
当页面被注入了恶意 JavaScript 脚本时,浏览器无法区分这些脚本是被恶意注入的还是正常的页面内容,所以恶意注入 JavaScript 脚本也拥有所有的脚本权限。

恶意的 XSS 脚本能做哪些事情?

  • 窃取 Cookie 信息
  • 监听用户行为
  • 可以通过修改 DOM 伪造假的登录窗口,用来欺骗用户输入用户名和密码等信息
  • 还可以在页面内生成浮窗广告

    恶意脚本是怎么注入的?

    XSS 脚本主要有以下几种注入方式:

  • 存储型 XSS 攻击:恶意代码存在漏洞的服务器

  • 反射型 XSS 攻击:黑客将恶意代码的请求提交给 Web 服务器,服务器接到用户的请求时,将恶意代码返回
  • 基于 DOM 的 XSS 攻击:不涉及 Web 服务器,一般是通过网络劫持(劫持路由器,本地软件劫持)修改 HTML 内容,使其包含恶意代码

    如何阻止 XSS 攻击?

  • 对注入脚本的关键字符进行转码

  • 充分利用 CSP
    • 限制加载其他域下的 js 脚本
    • 禁止向第三方域提交数据
    • 禁止执行内联脚本和未授权脚本
    • 提供上报机制,发现有哪些 XSS 攻击
  • 使用 Http-Only 属性

    对关键字符进行转码

    code:
    code:<script>alert('你被xss攻击了')</script>

    利用 CSP 防范 XSS

    实施严格的 CSP 可以有效地防范 XSS 攻击,具体来讲 CSP 有如下几个功能:

  • 限制加载其他域下的资源文件,这样即使黑客插入了一个 JavaScript 文件,这个 JavaScript 文件也是无法被加载的;

  • 禁止向第三方域提交数据,这样用户数据也不会外泄;
  • 禁止执行内联脚本和未授权的脚本;
  • 还提供了上报机制,这样可以帮助我们尽快发现有哪些 XSS 攻击,以便尽快修复问题。

    利用 HttpOnly 属性

    由于很多 XSS 攻击都是来盗用 Cookie 的,因此还可以通过使用 HttpOnly 属性来保护我们 Cookie 的安全。
    由于 JavaScript 无法读取设置了 HttpOnly 的 Cookie 数据,所以即使页面被注入了恶意 JavaScript 脚本,也是无法获取到设置了 HttpOnly 的数据。因此一些比较重要的数据我们建议设置 HttpOnly 标志。

    参考链接

    33 | 跨站脚本攻击(XSS):为什么Cookie中有HttpOnly属性? (geekbang.org)