XSS 全称是 Cross Site Scripting,为了与 CSS 作区分,所以简写为 XSS,表示跨站脚本攻击。
当页面被注入了恶意 JavaScript 脚本时,浏览器无法区分这些脚本是被恶意注入的还是正常的页面内容,所以恶意注入 JavaScript 脚本也拥有所有的脚本权限。
恶意的 XSS 脚本能做哪些事情?
- 窃取 Cookie 信息
- 监听用户行为
- 可以通过修改 DOM 伪造假的登录窗口,用来欺骗用户输入用户名和密码等信息
-
恶意脚本是怎么注入的?
XSS 脚本主要有以下几种注入方式:
存储型 XSS 攻击:恶意代码存在漏洞的服务器
- 反射型 XSS 攻击:黑客将恶意代码的请求提交给 Web 服务器,服务器接到用户的请求时,将恶意代码返回
基于 DOM 的 XSS 攻击:不涉及 Web 服务器,一般是通过网络劫持(劫持路由器,本地软件劫持)修改 HTML 内容,使其包含恶意代码
如何阻止 XSS 攻击?
对注入脚本的关键字符进行转码
- 充分利用 CSP
- 限制加载其他域下的 js 脚本
- 禁止向第三方域提交数据
- 禁止执行内联脚本和未授权脚本
- 提供上报机制,发现有哪些 XSS 攻击
-
对关键字符进行转码
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)