@
kisshere 很早以前的笔记,请参考
XSS 的防御需要在特定的场景下使用特定的方法:
1. 变量在 html 代码中输出,这时的应对方法应该是使用 htmlencode
所谓 htmlencode 就是让浏览器不把这部分信息当做 html 代码处理而是当做纯文本。这样就避免了对原有页面信息的污染。一般需要转义的字符包括以下:<、>、&、"、‘、/这六个。
2. 变量在 html 标签的属性中输出 例如 <div id="abc" name=""><script>alert(1)</script ><""></div>
防御方法也是采用 html 编码
3. 在 script 内输出变量:
(1) 保证变量处在""内 "$test" 这样如果发起攻击的话,首先就要绕过双引号的封锁
(2)对变量进行 javascript 编码,对 script 内的特殊字符前加上\
4. 在事件内输出: <a href="#" onclick="funA('$var')"></a>可以通过如下方式绕过
<a href="#" onclick="funA('');alert('1');"></a>
也需要进行 javascript 编码
5. 在 css 内输出:首先要尽力控制这种情况,不要允许用户自定义 css 的 style 等内容,如果必须这样做需要用到 owasp 的 encodeForcss()函数
6. 输出到 URL,使用 urlencode 就可以避免了,但注意 http://这部分不要被转义否则不能完成功能
7. 处理富文本,由于富文本必须当做 html 解析,所以比较复杂:
(1)首先过滤掉比较危险的标签<form><iframe><base><script>,尽量使用白名单
(2) 尽量禁止用户自定义 css 样式 style 属性
(3)使用比较好的 xssFiter
8. Dom 型的 XSS:一般先进行一次 javascriptencode 再进行一次 htmlencode 才可以完全过滤