XSS漏洞的总体防御原则: 输入做过滤,输出做转义
1、用户输入过滤
对用户输入的script等HTML标签和一些JS关键字进过滤。常见的过滤方法由白名单和黑名单两种。
其中Java的JSOUP采用了白名单的方式对用户的输入进行了过滤,在使用时需要指定一个可配置的Whitelist。在JSOUP中提供了一系列的Whitelist基本配置,能够满肚大多数的过滤要求,在有必要的情况下也可以自己配修改配置。
此外还有OWASP ESAPI也能较好的防御XSS漏洞。
2、转义输入与输出的特殊字符
在HTML中,<,>,",& 等符号都有其特殊意义,HTML标签、属性等也都由这些符号所标识。当我们这些字符做转义之后,对XSS漏洞的防御会起到较好的效果。
在PHP中,提供了htmlspecialchars()、htmlentites()函数可以把预定义的字符转义为HTML实体。
预定义的字符与转义结果如下:
- &(和号)–> &;
- "(双引号)–>";
- '(单引号)–>';
- <(小于)–><;
- 》>(大于)–>>;
3、使用HttpOnly
HttpOnly简介:
HttpOnly是微软公司的Internet Explorer 6 SPI 引入的一个新特性。这个特性为cookie提供了与i个新的属性,可以用于阻止用户客户端访问cookie。现在已经成为了一个标准,几乎所有的浏览器都支持HttpOnly。
所以严格来说,HttpOnly对防御XSS漏洞并不起作用,只能解决XSS漏洞后续的cookie劫持的问题。
将cookie设置了HttpOnly属性之后,在浏览器中查看cookie信息,就会发现用户的cookie信息中多了HTTP Only标识。这代表了JavaScript将不能获取该cookie值。
对于XSS漏洞来说,HttpOnly只能防御cookie会话劫持,对于其他的非正常操作、盗取用户信息、钓鱼等攻击并不能起到作用,所以关键还是在于输入输出的过滤与转义。