5.如何防范XSS攻击
1.HTML特殊字符
HTML 本身是一个文本文档,但在浏览器中却可以显现得花样百出,是因为很多字符对于浏览器来说是有特殊含义的,比如在<script>
中的内容,浏览器会做一些动画等等。那么对这些特殊字符进行转义,就意味着让浏览器对待它们的时候,就像普通字符一样,比如≶script>
这段文字在浏览器中就会正常显示为<script>
。
当我们在代码中生成 HTML 时,一定要注意,变量是否转义了。像这种
el.innerHTML = title.value;
就是非常危险的。因为输入框的内容来源于用户,而用户的输入是不可靠的。无论是前端还是后台,一定要有一个类似于 escapeHTML 的方法,然后在代码中这样使用
el.innerHTML = escapeHTML(title.value);
function encodeHTML (a) {
return String(a)
.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">")
.replace(/"/g, """)
.replace(/'/g, "'");
};
比如说像这样就不会存在攻击了,不过浏览器都支持自动转义了,IE和Chrome都支持
这里要说的是,浏览器只会对两个地方解码,一个是标签的内容(即 textContent,除了<script>
和<style>
标签),另一个是标签的属性值。对于属性名是不会解码的。
解码顺序
当浏览器进行绘制时,首先会对 HTML 进行解码,然后是 URL,最后是执行 JS 时对它进行解码。
现在考虑这三种编码同时存在的情况
<a href="javascript: alert('\<http://jchen.cc/find?q=%E4%BD%A0%E5%A5%BD\>');">click</a>
首先是 HTML 解码,结果为
<a href="javascript: alert('\<http://jchen.cc/find?q=%E4%BD%A0%E5%A5%BD\>');">click</a>
然后是 URL 解码,结果为
<a href="javascript: alert('\<http://jchen.cc/find?q=你好\>');">click</a>
最后是 JS 解码,结果为
<a href="javascript: alert('<http://jchen.cc/find?q=你好>');">click</a>
1.测试用例
黑盒测试和白盒测试