XSS Filter
XSS Filter的作用是过滤用户(客户端)提交的有害信息,从而达到防范XSS攻击的效果
XSS Filter作为防御跨站攻击的主要手段之一,已经广泛应用在各类Web系统之中,包括现今的许多应用软件,例如Chrome浏览器,通过加入XSS Filter功能可以有效防范所有非持久性XSS攻击。
两种过滤
业内防御跨站脚本攻击的方式一般有两种,Input Filtering和Output Filtering,即分别在输入端和输出端进行过滤
输入过滤的所有数据都需经过XSS Filter处理,被确认安全无害后才存入数据库中,而输出过滤只是应用于写出页面的数据,换言之,如果一段恶意代码早已存入数据库中,若只有采用输出过滤才能捕获非法数据,那么这两种方式在防范持久型XSS的时候回产生巨大差异。
输入验证
- 输入是否仅仅包含合法的字符
- 输入字符串是否超过最大长度限制
- 输入如果为数字,数字是否在制定的范围之内
- 输入是否符合特殊的格式要求,如E-mail地址,IP地址等
而对于重要敏感的信息,如折扣,价格等,理应放到服务器端进行传参与校验等操作。
数据消毒
除了在客户端验证数据的合法性,输入过滤中最重要的还是过滤和净化有害的输入,例如:
< > ' " & # javascript expression
为了能够提供两层防御和确保web应用程序的安全,对web应用的输出也要进行过滤和编码
输出编码
当需要将一个字符串输出到网页时,同时不确定这个字符串中是否包括XSS特殊字符(如< > & ' "等),为了确保输出内容的完整性和正确性,可以使用编码(HTMLEncode)进行处理。
htmlspacialchars()函数可以将以下五种HTML特殊字符转成字符实体编码:
< 转成 <
> 转成 >
& 转成 &
" 转成 "
' 转成 '
服务端过滤
输入过滤
在数据存进数据库之前便对特殊的字符进行转义,顺便可以把SQL注入等其他楼栋一并检验。而缺点就是无法处理之前已经存在于数据库中的恶意代码。
输出过滤
在数据输出之前先对部分敏感字符进行转义,能有效保持数据的完整性。缺点是必须对每一个细节的输出自习过滤,因此会带来额外的工作量。
script标签中的内容尽量避免或者减少在javascript上下文中使用动态内容