XSS又称CSS,全称Cross SiteScript(跨站脚本攻击),XSS攻击类似于SQL注入攻击,是Web程序中常见的漏洞,XSS属于被动式且
用于客户端的攻击方式,所以容易被忽略器危害性。
原理:攻击者向XSS 漏洞的网站输入(传入)恶意的HTML代码,当用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的
。如:盗取用户COOKIE信息、破坏页面结果
常见的恶意字符XSS输入:
1. XSS输入常用包含JavaScript脚本,如弹出恶意警告框 <script>alert('xss');</script>
2. XSS输入也可能是HTML代码段,譬如:
(1)网页不停地刷新<meta http-equiv="refresh" content="0">
(2) 嵌入其它网站的链接 <iframe src=http://xxxx width=250 height=250></iframe>
构、重定向到其它网站等。
防止方法:
(1)利用php htmlentities()函数
(2) php防止XSS跨站脚本攻击的方法:是针对非法的HTML代码包括单双引号等,使用htmlspecialchars()函数。
在使用htmlspecialchars()函数的时候注意第二个参数, 直接用htmlspecialchars($string)的话,第二个参数默认是ENT_COMPAT,函数默认只是转化双引号("),不对单引号(')做转义。
所以,htmlspecialchars()函数更多的时候要加上第二个参数,应该这样用: htmlspecialchars($string,ENT_QUOTES)。当然,如果需要不转化如何的引号,用htmlspecialchars($string,ENT_NOQUOTES)。
另外,尽量少用htmlentities(), 在全部英文的时候htmlentities()和htmlspecialchars()没有区别,都可以达到目的。但是,中文情况下, htmlentities()却会转化所有的html代码,连同里面的它无法识别的中文字符也给转化了。
htmlentities()和htmlspecialchars()这两个函数对单引号(')之类的字符串支持不好,都不能转化, 所以用htmlentities()和htmlspecialchars()转化的字符串只能防止XSS攻击,不能防止SQL注入攻击。
所有有打印的语句如echo,print等,在打印前都要使用htmlentities()进行过滤,这样可以防止XSS,注意中文要写出htmlentities($name,ENT_NOQUOTES,GB2312)。