xss漏洞的特征是在页面输出里注入html或者脚本,利用script环境和html事件机制,在宿主浏览器端执行某些恶意操作。
比如,截获用户登录cookie.
要防止这种漏洞,需要在输出用户输入字符串的地方进行过滤。
1 对用户自创建的脚本环境和html环境进行过滤,比如对<,>,双引号进行转义,实体输出。
2 对于在html属性中输出的情况,最好用双引号包住变量。
<input type="text" name="param" value=$a/> <input type="text" name="param" value=$b/> <input type="text" name="param" value=$c/> <input type="text" name="param" value="$d"/> <input type="text" name="param" value='$e'/>
输入
扫描二维码关注公众号,回复:
620991 查看本文章
$a='aa' onclick='alert(1)' $b=aa onclick='alert(2)' $c="aa" onclick='alert(3)' $d='aa' onclick='alert(4)' $e=aa' onclick='alert(5)
无双引号包含的成功注入,变量本身没有<>,"",因此1的转义方式对2 无效。
解决办法是属性加上双引号。
而事件属性比较难以防止,尽量不要在事件属性输出用户变量
如
<input type="text" name="param" onclick="$a" /> <input type="text" name="param" onclick="jsfun($b)" />
输入
$a=alert(1)
$b=0);alert(2
<input type="text" name="param" onclick="alert(1)" /> <input type="text" name="param" onclick="jsfun(0);alert(2)" />
成功注入
3 在脚本环境中输出的变量。
<script> var a = $a var b = '$b' var c = "$c" $jscode </script>
输入
$a='';alert(1);
$b=';alert(2);//
$c=";alert(3);//
$jscode=alert(4);
<script> var a = '';alert(1); var b = '';alert(2);//' var c = "";alert(3);//" alert(4); </script>
成功注入。
解决办法是用双引号输出,或者对变量的单引号进行\'和\"转义。
第四种难以预防,最好服务端不要采用这类方式实现。
总的来说,可以把xss漏洞的预防分为两块
A html输出,属性记得用双引号,对于<>等html标记必须进行转义,用实体输出。
B 脚本环境输出,var 变量赋值必须用单引号或者双引号输出,如果用双引号,那么必须对把变量的双引号转义成实体或\";如果用单引号,那么必须把单引号进行转义'->\'。
另外最好还要将/转义成\/,防止恶意代码逃逸出脚本环境。