一、检测方法:
寻找脚本程序的输出显示代码,搜索关键字,显示输出那个变量,跟踪变量是否被过滤。
可以先输入一些内容,页面返回之后,可以查看网页源代码,搜索内容关键字看看是不是直接返回在页面的HTML代码中。
二、防御方法:
1、调用函数:对于用户提交的数据可以通过调用函数进行过滤,htmlspecialchars()函数将输出的内容进行HTML的编码,效果最好;str_replace()函数可以将指定的字符串转换为其他字符串的,但是会被绕过。
2、使用XSS Filter:
(1)输入过滤:
输入验证(客户端):前端JS过滤,如检测最大长度、是否只有合法字符、格式是否符合要求、数字是否在指定的范围内。缺点就是容易被修改掉。
数据消毒(服务器端):过滤敏感字符(可以和SQL注入的一同过滤),如< > JavaScript ‘ “ & # expression等。
(2) 输出编码(服务器端):可以使用HTML编码(PHP的htmlspecialchars()函数、ASP的Server.HTMLEncode()函数、ASP.NET的Server.HtmlEncode()函数),用对应的HTML实体替代字面量字符,此时浏览器会将恶意代码当作HTML文档的内容而不是结构加以处理。
常见恶意字符的HTML编码(显示、实体名字、实体编号):
< < <;
> >;
& & &;
“ " ";
‘ '
3、白名单和黑名单结合
4、Noscript:Firefox的一款免费的开源插件,默认禁止所有脚本,但是可以通过自定义设置允许通过的脚本。
5、Anti_XSS:提供大量的编码函数用于处理用户的输入,实现白名单机制和输出转义
6、HttpOnly:攻击者通过XSS漏洞执行JS中的document.cookie方法来窃取用户的cookie信息。Web应用程序在Set-Cookie时将其属性设为HttpOnly即可避免Cookie被客户端JS存取,也可以保护用户的Cookie信息不被盗取。
PHP设置HttpOnly的方法:
(1) 修改php.ini文件,设置其值为1或TRUE;
(2) setcookie()函数和setrawcookie()函数的第七个参数;
(3)在PHP代码中开启。
7、Web安全编码规范:对敏感字符转义、URL属性进行相应的规定等。
8、尽量使用WAF
9、防御DOM型XSS:
DOM型XSS主要是由客户端的脚本通过DOM动态地输出数据到页面而不是依赖于将数据提交给服务器端,而从客户端获得DOM中的数据在本地执行,因而仅从服务器端是无法防御的。其防御在于:
(1) 避免客户端文档重写、重定向或其他敏感操作,同时避免使用客户端数据,这些操作尽量在服务器端使用动态页面来实现;
(2) 分析和强化客户端JS代码,特别是受到用户影响的DOM对象,注意能直接修改DOM和创建HTML文件的相关函数或方法,并在输出变量到页面时先进行编码转义,如输出到HTML则进行HTML编码、输出到