XSS又称CSS,全称Cross SiteScript(跨站脚本攻击), XSS攻击相似于SQL注入攻击,是Web程序中常见的漏洞,XSS属于被动式且用于客户端的攻击方式,因此容易被忽略其危害性。其原理是攻击者向有XSS漏洞的网站中输入(传入)恶意的HTML代码,当用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的。如,盗取用户Cookie信息、破坏页面结构、重定向到其它网站等。php
1. XSS 输入一般包含 JavaScript 脚本,如弹出恶意警告框:<script>alert("XSS");</script>html
2. XSS 输入也多是 HTML 代码段,譬如:mysql
(1) 网页不停地刷新 <meta http-equiv="refresh" content="0;">正则表达式
(2) 嵌入其它网站的连接 <iframe src=http://xxxx width=250 height=250></iframe>sql
对网站发动XSS攻击的方式有不少种,仅仅使用php的一些内置过滤函数是对付不了的,即便你将filter_var(),mysql_real_escape_string(),htmlentities(),htmlspecialchars(),strip_tags()这些函数都使用上了也不必定能保证绝对的安全。安全
那么如何预防 XSS 注入?主要仍是须要在用户数据过滤方面得考虑周全,在这里不彻底总结下几个 Tipsxss
方法一:利用php htmlentities()函数函数
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)。
方法二:自定义过滤XSS攻击的函数
/** * 防止XXS攻击 * @param $string * @param $low 安全别级低 */ function clean_xss(&$string, $low = false) { if (!is_array($string)) { $string = trim($string); $string = strip_tags($string); $string = htmlspecialchars($string); if ($low) { return true; } $string = str_replace(array('"', "\\", "'", "/", "..", "../", "./", "//" ), '', $string); $no = '/%0[0-8bcef]/'; $string = preg_replace($no, '', $string); $no = '/%1[0-9a-f]/'; $string = preg_replace($no, '', $string); $no = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S'; $string = preg_replace($no, '', $string); return true; } $keys = array_keys($string); foreach ($keys as $key) { clean_xss($string[$key]); } } $str = 'phpddt.com<meta http-equiv="refresh" content="0;">'; clean_xss($str); // 若是你把这个注释掉,你就知道xss攻击的厉害了 echo $str;
本文借鉴于:https://www.ibm.com/developerworks/cn/opensource/os-cn-php-xss/