前段时间公司网页被 xss 搞了一下,微信把域名封了,通宵搞了好几天。javascript
这两天把公司好几年来的代码都改了一遍,这工做丧心病狂。css
XSS 攻击指经过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的代码。html
http://upcdn"'></script><script src="//www.lilnong.top/xss.js"></script><script>alert(12306)</script><svg></svg>\n\t\n
上面的代码是咱们测试的时候使用的,接下来咱们来分析一下这个代码主要用途。前端
http://upcdn
这个字符串是用来假装的。vue
<img src="${str}">
动态拼接图片地址<a href="${str}">
动态跳转页面地址"'>
这两个就是为了截断当前字符串,而后闭合标签。java
<img src="${str}">
</script>
也是为了闭合标签,这个主要用在后台模板输出的时候。后台模板 velocity、freemarker 之类的。jquery
<script>var imgUrl = ${str}</script>
<script src="//www.lilnong.top/xss.js"></script>
就是引入一个js,这种方式比较常见。注入以后,攻击者只须要修改本身的文件,就能够更新了。<script>alert(12306)</script>
直接执行js代码<svg></svg>
注入一个元素,用于展现一个异常块打乱布局。好比 vue
中的 v-html
不会执行 script
标签中的内容,可是会显示 svg
图片。\n\t\n
是为了测试后台模板输出的场景。toHtml
主要用于输出在页面(标签中)中,将用户输入的内容进行编码好比 <
转换为<
。后端
<span>${nickanme}</span>
toJS
主要用于输出在script标签中,这里须要防止打断js,好比处理成"'\n
为\"\'\\n
toUrl
这里其实和 toHtml
场景很像,可是须要判断url基础格式。浏览器
https://
//lilnong.top
/static
./static
../static
.html
输出一下。这里须要作的也是把用户输入的作一下实体编码转换。toHtml
或者 encode
均可以。v-html
这里须要注意一下,尽量不要使用,由于会致使注入问题。也能够toHtml一下,可是不必不是吗。:href
主要 javascript:alert(1);
这种场景,作url校验就能够。innerHTML
的那些人。HTML Purifier
toHtml
,而后再匹配替换,最后在输出到页面便可。有时咱们在textarea
中输入\n
,渲染的时候空白符就被浏览器给吃了。针对这种状况,咱们能够用下面的方案处理微信
white-space
,或者 <pre>
标签.replace(/\n/g,'<br>)
,这种输出的时候万一里面有代码不就凉了吗。因此咱们先 toHtml 而后在使用,这样能够防止注入问题。.innerText
能够自动把\n
转换为<br>
,你能够本身试试window.base = { toHtml: function (val) { if( typeof val != 'string' ) return ''; var entityMap = { "&": "&", "<": "<", ">": ">", '"': '"', "'": ''', "/": '/' }; return String(val).replace(/[&<>"'\/]/g, function (s) { return entityMap[s]; }); }, toUrl: function (url) { if( typeof url != 'string' ) return '#'; if(url.match(/^http/i)){ return encodeURI(url) } return '#' }, };