5.如何防范XSS攻击


1.HTML特殊字符

HTML 本身是一个文本文档,但在浏览器中却可以显现得花样百出,是因为很多字符对于浏览器来说是有特殊含义的,比如在<script>中的内容,浏览器会做一些动画等等。那么对这些特殊字符进行转义,就意味着让浏览器对待它们的时候,就像普通字符一样,比如&lg;script&gt;这段文字在浏览器中就会正常显示为<script>

当我们在代码中生成 HTML 时,一定要注意,变量是否转义了。像这种

el.innerHTML = title.value;

就是非常危险的。因为输入框的内容来源于用户,而用户的输入是不可靠的。无论是前端还是后台,一定要有一个类似于 escapeHTML 的方法,然后在代码中这样使用

el.innerHTML = escapeHTML(title.value);
function encodeHTML (a) {
  return String(a)
    .replace(/&/g, "&amp;")
    .replace(/</g, "&lt;")
    .replace(/>/g, "&gt;")
    .replace(/"/g, "&quot;")
    .replace(/'/g, "&#39;");
};

比如说像这样就不会存在攻击了,不过浏览器都支持自动转义了,IE和Chrome都支持

这里要说的是,浏览器只会对两个地方解码,一个是标签的内容(即 textContent,除了<script><style>标签),另一个是标签的属性值。对于属性名是不会解码的。

解码顺序

当浏览器进行绘制时,首先会对 HTML 进行解码,然后是 URL,最后是执行 JS 时对它进行解码。

现在考虑这三种编码同时存在的情况

<a href="javascript&#58;&#32;alert('\<http&#58;&#47;&#47;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.测试用例

黑盒测试和白盒测试


参考:https://cnodejs.org/topic/561cf46ce40cbc026b25fc30

results matching ""

    No results matching ""