目录
回复内容:
首页 后端开发 php教程 mysql_real_escape_string()函数 在不同版本php中不同处理!

mysql_real_escape_string()函数 在不同版本php中不同处理!

Jul 06, 2016 pm 01:53 PM
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日志,显示宽字符处也被转义了。

代码:

<code>$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());
?&gt;</code>
登录后复制
登录后复制

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

<code>            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</code>
登录后复制
登录后复制

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

<code>      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    </code>
登录后复制
登录后复制

这里我的问题是,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日志,显示宽字符处也被转义了。

代码:

<code>$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());
?&gt;</code>
登录后复制
登录后复制

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

<code>            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</code>
登录后复制
登录后复制

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

<code>      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    </code>
登录后复制
登录后复制

这里我的问题是,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()

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门文章

两个点博物馆:邦格荒地地点指南
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热门文章

两个点博物馆:邦格荒地地点指南
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热门文章标签

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南 适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南 Dec 24, 2024 pm 04:42 PM

适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南

CakePHP 日期和时间 CakePHP 日期和时间 Sep 10, 2024 pm 05:27 PM

CakePHP 日期和时间

CakePHP 文件上传 CakePHP 文件上传 Sep 10, 2024 pm 05:27 PM

CakePHP 文件上传

CakePHP 路由 CakePHP 路由 Sep 10, 2024 pm 05:25 PM

CakePHP 路由

讨论 CakePHP 讨论 CakePHP Sep 10, 2024 pm 05:28 PM

讨论 CakePHP

CakePHP 项目配置 CakePHP 项目配置 Sep 10, 2024 pm 05:25 PM

CakePHP 项目配置

CakePHP 快速指南 CakePHP 快速指南 Sep 10, 2024 pm 05:27 PM

CakePHP 快速指南

CakePHP 创建验证器 CakePHP 创建验证器 Sep 10, 2024 pm 05:26 PM

CakePHP 创建验证器

See all articles