首页 > 代码库 > htmlspecialchars()

htmlspecialchars()

htmlspecialchars()默认只编码双引号,所以普通的htmlspecialchars($str)无法过滤单引号,导致注入。
参数 描述
string 必需。规定要转换的字符串。
flags 可选。规定如何处理引号、无效的编码以及使用哪种文档类型。 可用的引号类型: · ENT_COMPAT - 默认。仅编码双引号。 · ENT_QUOTES - 编码双引号和单引号。 · ENT_NOQUOTES - 不编码任何引号。 无效的编码: · ENT_IGNORE - 忽略无效的编码,而不是让函数返回一个空的字符串。应尽量避免,因为这可能对安全性有影响。 · ENT_SUBSTITUTE - 把无效的编码替代成一个指定的带有 Unicode 替代字符 U+FFFD(UTF-8)或者 的字符,而不是返回一个空的字符串。 · ENT_DISALLOWED - 把指定文档类型中的无效代码点替代成 Unicode 替代字符 U+FFFD(UTF-8)或者 。 规定使用的文档类型的附加 flags: · ENT_HTML401 - 默认。作为 HTML 4.01 处理代码。 · ENT_HTML5 - 作为 HTML 5 处理代码。 · ENT_XML1 - 作为 XML 1 处理代码。 · ENT_XHTML - 作为 XHTML 处理代码。
<?php
$a=$_GET[‘a‘];
echo htmlspecialchars($a);
当1.php?a=1%27%22%27时输出1‘"‘ 实例: 在BEECMS V4.0_R_20150708中admin/login.php代码如下:
elseif($action==‘ck_login‘){
	global $submit,$user,$password,$_sys,$code;
	$submit=$_POST[‘submit‘];
	$user=fl_html(fl_value($_POST[‘user‘]));
	$password=fl_html(fl_value($_POST[‘password‘]));
	$code=$_POST[‘code‘];
	if(!isset($submit)){
		msg(‘请从登陆页面进入‘);
	}
	if(empty($user)||empty($password)){
		msg("密码或用户名不能为空");
	}
	if(!empty($_sys[‘safe_open‘])){
		foreach($_sys[‘safe_open‘] as $k=>$v){
		if($v==‘3‘){
			if($code!=$s_code){msg("验证码不正确");}
		}
		}
		}
	check_login($user,$password);

	$user=fl_html(fl_value($_POST[‘user‘]));
	$password=fl_html(fl_value($_POST[‘password‘]));
由post获得 并经过fl_value和fl_html处理。 在includes/fun.php下
function fl_value($str){
	if(empty($str)){return;}
	return preg_replace(‘/select|insert | update | and | in | on | left | joins | delete |%|=|/*|*|../|./| union | from | where | group | into |load_file
|outfile/i‘,‘‘,$str);
}
define(‘INC_BEES‘,‘B‘.‘EE‘.‘SCMS‘);
function fl_html($str){
	return htmlspecialchars($str);
}
Fl_value过滤了关键字
Fl_html采用htmlspecialchars 只过滤了双引号
function check_login($user,$password){
	$rel=$GLOBALS[‘mysql‘]->fetch_asc("select id,admin_name,admin_password,admin_purview,is_disable from ".DB_PRE."admin where admin_name=‘".$user."‘ limit 0,1");
导致引入单引号进行注入 且在正则内过滤了union和on 采用unionon即可绕过 其他关键字双写即可绕过

查看原文:http://www.am0s.com/functions/181.html

htmlspecialchars()