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

时间: 2024-10-14 20:13:46

htmlspecialchars()的相关文章

html 实体和htmlspecialchars()

HTML 中的预留字符必须被替换为字符实体. HTML 实体 在 HTML 中,某些字符是预留的. 在 HTML 中不能使用小于号(<)和大于号(>),这是因为浏览器会误认为它们是标签. 如果希望正确地显示预留字符,我们必须在 HTML 源代码中使用字符实体(character entities). 字符实体类似这样: &entity_name; 或者 &#entity_number; 如需显示小于号,我们必须这样写:< 或 < 提示:使用实体名而不是数字的好处是,

htmlspecialchars()和htmlspecialchars_decode()

htmlspecialchars_decode() 函数是 htmlspecialchars() 函数的反函数. htmlspecialchars() 可以拿来防止XSS;可参考:https://www.zhihu.com/question/27646993 htmlspecialchars_decode() 函数 更多实例 例子 1 把预定义的 HTML 实体转换为字符: <?php $str = "Bill & 'Steve'"; echo htmlspecialch

PHP中htmlentities和htmlspecialchars的区别

这两个函数的功能都是转换字符为HTML字符编码,特别是url和代码字符串.防止字符标记被浏览器执行.使用中文时没什么区别,但htmlentities会格式化中文字符使得中文输入是乱码 htmlentities转换所有的html标记,htmlspecialchars只格式化& ' " < 和 > 这几个特殊符号 $str = '<a href="demo.php?m=index&a=index&name=中文">测试页面</

php中htmlspecialchars,htmlentities用法

[导读] 在php中htmlspecialchars, 将特殊字元转成 HTML 格式,而htmlentities,将所有的字元都转成 HTML 字串 了,下面我来分别简单的介绍. htmlentities用法 代码如下复制代码 在php中htmlspecialchars, 将特殊字元转成 HTML 格式,而htmlentities,将所有的字元都转成 HTML 字串 了,下面我来分别简单的介绍. htmlentities用法 $str = "John & 'Adams'";e

php中htmlspecialchars()函数和addslashes()函数的使用和区别

在防止被注入攻击时,常会用到两个函数:htmlspecialchars()和addslashes()函数.这两个函数都是对特殊字符进行转义. 1)addslashes()作用及使用 addslashes()通常用于防止sql注入,它可对通过get,post和cookie传递过来的参数的单引号和双引号已经null前加“\”进行转义 如:如变量$str=$_POST["str"];的值为:bb' or 1='1.通过addslashes()函数过滤后会变为:bb\' or 1=\'1: 2

PHP htmlspecialchars和htmlspecialchars_decode(函数)

PHP htmlspecialchars和htmlspecialchars_decode(函数) htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体. 函数原型:htmlspecialchars(string,quotestyle,character-set) 预定义的字符是: & (和号) 成为 & ” (双引号) 成为 " ‘ (单引号) 成为 ' < (小于) 成为 < > (大于) 成为 > htmlspecialc

php 使用htmlspecialchars() 和strip_tags函数过滤HTML标签的区别

原文地址:http://www.manongjc.com/article/1103.html 先来看一下htmlspecialchars函数和strip_tags函数的使用实例: <?php $str="<a href='http://www.manongjc.com'>码农教程'\"</a>"; echo htmlspecialchars($str); echo "<br/><br/>"; echo

urlencode rawurlencode htmlspecialchars htmlentities

w string urlencode ( string $str ) 返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+).此编码与 WWW 表单 POST 数据的编码方式是一样的,同时与 application/x-www-form-urlencoded 的媒体类型编码方式一样.由于历史原因,此编码在将空格编码为加号(+)方面与 ? RFC3896 编码(参见 rawurlencode())不同. string rawu

PHP 5.4 已废弃 magic_quotes_gpc,PHP安全转义函数详解(addslashes 、htmlspecialchars、htmlentities、mysql_real_escape_string、strip_tags)

1. addslashes() addslashes()对SQL语句中的特殊字符进行转义操作,包括(‘), (“), (), (NUL)四个字符,此函数在DBMS没有自己的转义函数时候使用,但是如果DBMS有自己的转义函数,那么推荐使用原装函数,比如MySQL有mysql_real_escape_string()函数用来转义SQL. 注意在PHP5.3之前,magic_quotes_gpc是默认开启的,其主要是在$GET, $POST, $COOKIE上执行addslashes()操作,所以不需