xss(Cross Site Scripting),即跨站脚本攻击,是一种常见于web应用程序中的计算机安全漏洞。指的是在用户浏览器上,在渲染DOM树的时候,执行了不可预期的JS脚本,从而发生了安全问题。
XSS就是通过在用户端注入恶意的可运行脚本,若服务端对用户的输入不进行处理,直接将用户的输入输出到浏览器,然后浏览器将会执行用户注入的脚本。 所以XSS攻击的核心就是浏览器渲染DOM的时候将文本信息解析成JS脚本从而引发JS脚本注入,那么XSS攻击的防御手段就是基于浏览器渲染这一步去做防御。只要我们使用HTML编码将浏览器需要渲染的信息编码后,浏览器在渲染DOM元素的时候,会自动解码需要渲染的信息,将上述信息解析成字符串而不是JS脚本,这就是我们防御XSS攻击的核心想法。
预防:
1、获取用户的输入,不用innerHtml,用innerText,用户的输入永远是不可以信任的,不能让所有的输入保持原样,对用户输入的数据进行HTML Entity编码,最普遍的做法就是转义输入输出的内容,对于引号、尖括号、斜杠 进行转义。白名单库:xss库
const xss = require('xss') let html = xss('<h1 id="title">XSS Demo</h1<script>alert("xss");</script>')
// -> <h1>XSS Demo</h1><script>alert("xss");</script> console.log(html)
2、对用户的输入进行过滤,如对& < > " ' / <a>等进行转义;
3、设置HttpOnly以避免cookie劫持的风险;
response.addHeader("Set-Cookie", "uid=112; Path=/; HttpOnly")
4、csp: Content Security Plicy
内容安全策略是一个附加的安全层,用于帮助检查和缓解某些类型的攻击,包括跨站脚本(xss)和数据注入等攻击,这些攻击可用于实现从数据窃取到网站破坏或作为恶意软件分发版本等用途
// 只允许加载本站资源
Content-Security-Policy: default-src 'self'
// 只允许加载 HTTPS 协议图片
Content-Security-Policy: img-src https://*
// 不允许加载任何来源框架
Content-Security-Policy: child-src 'none'
5、编码后显示的时候还需要解码,解码后显示原样代码前过滤,过滤掉不合法输入,以保证安全,移除用户上传的DOM属性,如onerror等,移除用户上传的Style节点,Iframe节点等;onerror自动触发xss。style:body:display:none .js对页面有百分比操作权限。iframe引入其它页面资源。通过xss注入的方式,引诱用户触发csrf攻击。