mysql_real_escape_string()函数 在不同版本php中不同处理!
这里我做了一个小实验,只使用了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()指定连接字符集了吗?如果不需要它是怎么判断的!!!!
回复内容:
发现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()指定连接字符集了吗?如果不需要它是怎么判断的!!!!
这个和 PHP 版本没有关系,mysql 和 mysqli 扩展是直接使用 C 语言开发的,而且 mysql 的第三方库也是通过 C API 提供的。
所以,这个应该和 mysql.dll 的版本有关,也就是 mysql lib 的版本。
mysql 扩展的版本可以使用 mysql_get_client_info()
函数获得。
至于你的问题,可以参考一下 MySQL 的开发者手册:23.8.7.53 mysql_real_escape_string()
上一篇: Bootstrap洼地是什么?
推荐阅读
-
mysql_real_escape_string()函数 在不同版本php中不同处理!
-
parallels desktop 9 PHP 在51 和52之间 PDO数据库操作中的不同之处小结
-
PHP 在5.1.* 和5.2.*之间 PDO数据库操作中的不同之处小结
-
php post请求和jquery中post请求有什么不同吗?该如何处理
-
PHP5.5和之前的版本empty函数的不同之处
-
PHP5.5和之前的版本empty函数的不同之处
-
PHP 在5.1.* 和5.2.*之间 PDO数据库操作中的不同之处小结
-
PHP 在5.1.* 和5.2.*之间 PDO数据库操作中的不同之处小结_PHP教程
-
PHP函数eregi()在实际应用中与ereg()的不同之处
-
php-在不同浏览器中,返回的function_exists('uc_pm_checknew')值不同