常见漏洞防护(一)---xss漏洞

笔者能力有限,本篇只介绍了简单的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 实体。

预定义的字符是:

& (和号)成为 &
" (双引号)成为 "
' (单引号)成为 '
< (小于)成为 <
> (大于)成为 >

w3cschool讲解

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 处理代码。

w3cschool讲解

两个函数的区别

htmlentities转换所有的html标记,htmlspecialchars只转义& 、’、 “、 <、> 这几个特殊符号。使用htmlentities不指定编码的话遇到中文会乱码。

原文地址:https://www.cnblogs.com/BuFFERer/p/12601564.html