正确地防御XSS
摘自《白帽子讲web安全》第三章
XSS的本质是一种“HTML注入”,用户的数据被当成了HTML代码一部分来执行,从而混淆了原本的语义,产生了新的语义。
在HTML标签中输出,在HTML属性中输出
防御方法:对变量使用HtmlEncode
在<script>标签中输出
防御:使用JavascriptEncode
在事件中输出
防御:使用JavascriptEncode
在CSS中输出
防御:尽可能禁止用户可控制的变量在“<style>标签”、“HTML标签的style属性”以及“CSS文件”中输出。如果一定有这样的需求,则推荐使用OWASP ESAPI中的encodeForCSS()函数。
在地址中输出
防御:一般来说,在URL的path(路径)或者search(参数)中输出,使用URLEncode即可。
如果变量是整个URL,则应该先检查变量是否以“http”开头(如果不是则自动添加),以保证不会出现伪协议类的XSS攻击。在此之后,再对变量进行URLEncode,即可保证不会有此类的XSS发生了。
HTML Encoding escapes special characters in strings used in HTML documents to prevent confusion with HTML elements like changing.
"<hello>world</hello>"
to
"<hello>world</hello>"