笔者能力有限,本篇只介绍了简单的PHP方面的XSS防护
一、基于白名单、黑名单的过滤
基于白名单
基于白名单时,设置允许存在的标签,不存在白名单的直接返回,例如wordpress -> wp-include -> kses.php文件中,对每个标签的属性进行过滤
基于黑名单
基于黑名单时,不太安全,毕竟自己不知道的知识点太多,过滤起来可能不全面,,例如利用str_place()、preg_replace()过滤时,会有漏掉的标签,比如下面这样,只过滤了<script>
标签,用其他姿势轻松绕过
<?
$name = str_replace('<script>','',$_GET['a']);
echo $name;
?>
二、转义
转义主要用到htmlspecialchars函数和htmlentities函数
htmlspecialchars()
htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。
预定义的字符是:
& (和号)成为 &
" (双引号)成为 "
' (单引号)成为 '
< (小于)成为 <
> (大于)成为 >
htmlentities()
htmlentities(string,flags,character-set,double_encode)
当flag字段为不同的值时,
可选。规定如何处理引号、无效的编码以及使用哪种文档类型。
可用的引号类型:
ENT_COMPAT - 默认。仅编码双引号。
ENT_QUOTES - 编码双引号和单引号。
ENT_NOQUOTES - 不编码任何引号。
无效的编码:
ENT_IGNORE - 忽略无效的编码,而不是让函数返回一个空的字符串。应尽量避免,因为这可能对安全性有影响。
ENT_SUBSTITUTE - 把无效的编码替代成一个指定的带有 Unicode 替代字符 U+FFFD(UTF-8)或者 &#FFFD; 的字符,而不是返回一个空的字符串。
ENT_DISALLOWED - 把指定文档类型中的无效代码点替代成 Unicode 替代字符 U+FFFD(UTF-8)或者 &#FFFD;。
规定使用的文档类型的附加 flags:
ENT_HTML401 - 默认。作为 HTML 4.01 处理代码。
ENT_HTML5 - 作为 HTML 5 处理代码。
ENT_XML1 - 作为 XML 1 处理代码。
ENT_XHTML - 作为 XHTML 处理代码。
两个函数的区别
htmlentities转换所有的html标记,htmlspecialchars只转义& 、’、 “、 <、> 这几个特殊符号。使用htmlentities不指定编码的话遇到中文会乱码。