PHP函数addslashes和mysql_real_escape_string的区别


Posted in PHP onApril 22, 2014

首先:不要使用mysql_escape_string,它已被弃用,请使用mysql_real_escape_string代替它。

mysql_real_escape_string和addslashes的区别在于:

区别一:

addslashes不知道任何有关MySQL连接的字符集。如果你给所使用的MySQL连接传递一个包含字节编码之外的其他编码的字符串,它会很愉快地把所有值为字符‘、“、\和\x00的字节进行转义。如果你正在使用不同于8位和UTF-8的其它字符,这些字节的值不一定全部都是表示字符‘、“、\和\x00。可能造成的结果是,MySQL接收这些字符后出现错误。

如果要修正这个bug,可尝试使用iconv函数,将变量转为UTF-16,然后再使用addslashes进行转义。

这是不使用addslashes进行转义的原因之一。

区别二:

与addslashes对比,mysql_real_escape_string同时还对\r、\n和\x1a进行转义。看来,这些字符必须正确地告诉MySQL,否则会得到错误的查询结果。

这是不使用addslashes进行转义的另一个原因。

addslashes V.S. mysql_real_escape_string

在GBK里,0xbf27不是一个合法的多字符字符,但0xbf5c却是。在单字节环境里,0xbf27被视为0xbf后面跟着0×27(‘),同时0xbf5c被视为0xbf后面跟着0x5c(\)。

一个用反斜杠转义的单引号,是无法有效阻止针对MySQL的SQL注入攻击的。如果你使用addslashes,那么,我(攻击者,下同)是很幸运的。我只要注入一些类似0xbf27,然后addslashes将它修改为0xbf5c27,一个合法的多字节字符后面接着一个单引号。换句话说,我可以无视你的转义,成功地注入一个单引号。这是因为0xbf5c被当作单字节字符,而非双字节。

在这个演示中,我将使用MySQL 5.0和PHP的mysqli扩展。如果你想尝试,请确保你使用GBK。

创建一个名为users的表:

CREATE TABLE users(
 username VARCHAR(32) CHARACTER SET GBK,
 password VARCHAR(32) CHARACTER SET GBK,
 PRIMARY KEY(username)
);

下面的代码模拟只使用addslashes(或magic_quotes_gpc)对查询数据进行转义时的情况:
<?php
$mysql = array();
$db = mysqli_init();
$db->real_connect('localhost', 'lorui', 'lorui.com', 'lorui_db');
/* SQL注入示例 */
$_POST['username'] = chr(0xbf) . chr(0×27) . ‘ OR username = username /*'; $_POST['password'] = ‘guess'; $mysql['username'] = addslashes($_POST['username']); $mysql['password'] = addslashes($_POST['password']); $sql = “SELECT * FROM users WHERE username = ‘{$mysql['username']}' AND password = ‘{$mysql['password']}'”; $result = $db->query($sql); if ($result->num_rows) { /* 成功 */ } else { /* 失败 */ }

尽管使用了addslashes,我还是可以在不知道用户名和密码的情况下成功登录。我可以轻松的利用这个漏洞进行SQL注入。

要以免这种漏洞,使用mysql_real_escape_string、准备语句(Prepared Statements,即“参数化查询”)或者任意一款主流的数据库抽象类库。

PHP 相关文章推荐
PHP 日常开发小技巧
Sep 23 PHP
PHP整数取余返回负数的相关解决方法
May 15 PHP
php下Memcached入门实例解析
Jan 05 PHP
避免Smarty与CSS语法冲突的方法
Mar 02 PHP
php发送html格式文本邮件的方法
Jun 10 PHP
php里array_work用法实例分析
Jul 13 PHP
如何使用纯PHP实现定时器任务(Timer)
Jul 31 PHP
PHP Try-catch 语句使用技巧
Feb 28 PHP
PHP依赖注入(DI)和控制反转(IoC)详解
Jun 12 PHP
yii2.0整合阿里云oss的示例代码
Sep 19 PHP
Yii2框架加载css和js文件的方法分析
May 25 PHP
laravel 创建命令行命令的图文教程
Oct 23 PHP
自己写了一个php检测文件编码的函数
Apr 21 #PHP
CodeIgniter框架提示Disallowed Key Characters的解决办法
Apr 21 #PHP
PHP5中实现多态的两种方法实例分享
Apr 21 #PHP
PHP开发中常见的安全问题详解和解决方法(如Sql注入、CSRF、Xss、CC等)
Apr 21 #PHP
PHP正则提取不包含指定网址的图片地址的例子
Apr 21 #PHP
phpmyadmin打开很慢的解决方法
Apr 21 #PHP
PHP递归删除目录几个代码实例
Apr 21 #PHP
You might like
php的header和asp中的redirect比较
2006/10/09 PHP
使用ucenter实现多站点同步登录的讲解
2019/03/21 PHP
php的扩展写法总结
2019/05/14 PHP
遨游,飞飞,IE,空中网 浏览器无提示关闭方法
2011/07/11 Javascript
Underscore.js 的模板功能介绍与应用
2012/12/24 Javascript
引用外部脚本时script标签关闭的写法
2014/01/20 Javascript
apply和call方法定义及apply和call方法的区别
2015/11/15 Javascript
浅谈jQuery 中的事件冒泡和阻止默认行为
2016/05/28 Javascript
[原创]jQuery常用的4种加载方式分析
2016/07/25 Javascript
bootstrap下拉菜单使用方法解析
2017/01/13 Javascript
页面缩放兼容性处理方法(zoom,Firefox火狐浏览器)
2017/08/29 Javascript
jQuery位置选择器用法实例分析
2019/06/28 jQuery
jquery实现聊天机器人
2020/02/08 jQuery
Python实现注册登录系统
2017/08/08 Python
python获取外网IP并发邮件的实现方法
2017/10/01 Python
python使用pandas实现数据分割实例代码
2018/01/25 Python
Python实现读取机器硬件信息的方法示例
2018/06/09 Python
使用python脚本实现查询火车票工具
2018/07/19 Python
解决pyqt5中QToolButton无法使用的问题
2019/06/21 Python
Django 创建新App及其常用命令的实现方法
2019/08/04 Python
详解基于python的多张不同宽高图片拼接成大图
2019/09/26 Python
浅谈PyTorch的可重复性问题(如何使实验结果可复现)
2020/02/20 Python
JAVA及PYTHON质数计算代码对比解析
2020/06/10 Python
北美女性服装零售连锁店:maurices
2019/06/12 全球购物
电气自动化个人求职信范文
2014/02/03 职场文书
党员教师批评与自我批评发言稿
2014/10/15 职场文书
同学会邀请函模板
2015/01/30 职场文书
档案工作个人总结
2015/03/03 职场文书
单位推荐信范文
2015/03/27 职场文书
2015年办税服务厅工作总结
2015/07/23 职场文书
安全生产感想
2015/08/07 职场文书
《赵州桥》教学反思
2016/02/17 职场文书
八年级作文之友谊
2019/12/02 职场文书
25句企业管理语录:助你迅速打开思路,句句经典!
2020/01/14 职场文书
python读取pdf格式文档的实现代码
2021/04/01 Python
深入讲解Vue中父子组件通信与事件触发
2022/03/22 Vue.js