如何防止xss攻击

前言

上一篇说到了何为xss攻击,以及xss攻击的分为三类,存储型xss反射型xss,以及dom型xss

由于xss的原理是恶意代码在浏览器执行导致。所以对xss防范的核心理念就是让恶意代码不可执行。其手段有二:

1,过滤输入
2,转义输出

过滤输入(Filtering for XSS)

过滤输入就是输入中的可执行代码标记,比如特殊符号及字样(()<>& script)过滤到,将其去除,或替换成无威胁的字符。

对于基于web的java应用,可以使用filter拦截请求,对请求中的输入参数使用正则匹配特殊,然后进行替换处理

转义输出(Escaping from XSS)

有时确实需要在页面上展示代码片段,但不让其执行。比如很多技术博客都可能发布脚本代码片段。如果用上面的过滤输入,那么将会把代码片段破坏掉,不可取,这时就需要转义输出。 转义输出就是将代码片段中的特殊字符转义,使其能正常被浏览器显示出来,但是不会被执行。 特殊字符转义对照表如下(有两种,在chrome浏览器下测试两种皆可)

转义方式1

& --> &amp;
< --> &lt;
> --> &gt;
" --> &quot;
' --> &#x27;     
/ --> &#x2F; 

转义方式2

" ---> &#34
# ---> &#35
& ---> &#38
' ---> &#39
( ---> &#40
) ---> &#41
/ ---> &#47
; ---> &#59
< ---> &#60
> ---> &#62

总结

一个典型的web程序对xss攻击可能即需要xss filter,又需要xss esccape。其处理流程如下:

注意事项

dom型攻击将不会到达server端,故server端所采取的filter或则escape措施都将失效。所以对于可能发生dom型xss攻击的地方,最好好要采用页面级别的xss过滤或转义

参考资料

https://www.owasp.org/index.php/XSS(CrossSiteScripting)PreventionCheatSheet
http://www.acunetix.com/blog/articles/preventing-xss-attacks/