什么是XSS攻击?
XSS 攻击是指黑客往 HTML 文件中或者 DOM 中注入恶意脚本,从而在用户浏览页面时利用注入的恶意脚本对用户实施攻击的一种手段。
恶意脚本可以做哪些事情?
- 通过
document.cookie
窃取Cookie信息 - 通过
addEventListener
监听用户行为 - 通过修改 DOM伪造假的登录窗口,用来欺骗用户输入用户名和密码等信息
- 还可以在页面内生成浮窗广告,这些广告会严重地影响用户体验
恶意脚本的注入方式有哪些?
- 存储型 XSS 攻击
- 首先黑客利用站点漏洞将一段恶意 JavaScript 代码提交到网站的数据库中;
- 然后用户向网站请求包含了恶意 JavaScript 脚本的页面;
- 当用户浏览该页面的时候,恶意脚本就会将用户的 Cookie 信息等数据上传到服务器。
- 反射型 XSS 攻击
用户将一段含有恶意代码的请求提交给 Web 服务器,Web 服务器接收到请求时,又将恶意代码反射给了浏览器端,这就是反射型 XSS 攻击(比如:黑客经常会通过 QQ 群或者邮件等渠道诱导用户去点击这些恶意链接)
Web 服务器不会存储反射型 XSS 攻击的恶意脚本,这是和存储型XSS 攻击不同的地方
- 基于 DOM的 XSS 攻击
在 Web 资源传输过程或者在用户使用页面的过程中修改 Web 页面的数据,基于 DOM 的 XSS 攻击是不牵涉到页面 Web 服务器的。(比如通过 WiFi 路由器劫持或者通过本地恶意软件来劫持等)
如何阻止XSS攻击?
由于存储型XSS攻击和反射性XSS攻击都是需要经过Web服务器来处理的,因此可认为这两种类型的漏洞是服务端的安全漏洞。而基于 DOM 的 XSS 攻击全部都是在浏览器端完成的,因此基于 DOM 的 XSS 攻击是属于前端的安全漏洞。
但他们的共同点都是:首先往浏览器中注入恶意脚本,然后再通过恶意脚本将用户信息发送至黑客部署的恶意服务器上。
因此阻止 XSS 攻击,我们可以通过阻止恶意 JavaScript 脚本的注入和恶意消息的发送来实现。
-
服务器对输入脚本进行过滤或转码
-
充分利用CSP
- 限制加载其他域下的资源文件,这样即使黑客插入了一个 JavaScript 文件,这个JavaScript 文件也是无法被加载的;
- 禁止向第三方域提交数据,这样用户数据也不会外泄;
- 禁止执行内联脚本和未授权的脚本;
- 还提供了上报机制,这样可以帮助我们尽快发现有哪些 XSS 攻击,以便尽快修复问题。
-
使用 HttpOnly 属性
由于很多 XSS 攻击都是来盗用 Cookie 的,因此还可以通过使用 HttpOnly 属性来保护我们 Cookie 的安全。使用 HttpOnly 标记的 Cookie 只能使用在 HTTP 请求过程中,所以无法通过 JavaScript 来读取这段 Cookie。
-
通过添加验证码防止脚本冒充用户提交危险操作
-
对于一些不受信任的输入,还可以限制其输入长度