PHP与SQL注入攻击防范小技巧


Posted in PHP onSeptember 16, 2011

下面来谈谈SQL注入攻击是如何实现的,又如何防范。

 看这个例子:

// supposed input 
$name = "ilia'; DELETE FROM users;"; 
mysql_query("SELECT * FROM users WHERE name='{$name}'");

 很明显最后数据库执行的命令是:

SELECT * FROM users WHERE name=ilia; DELETE FROM users

 这就给数据库带来了灾难性的后果?所有记录都被删除了。

 不过如果你使用的数据库是MySQL,那么还好,mysql_query()函数不允许直接执行这样的操作(不能单行进行多个语句操作),所以你可以放心。如果你使用的数据库是SQLite或者PostgreSQL,支持这样的语句,那么就将面临灭顶之灾了。

 上面提到,SQL注入主要是提交不安全的数据给数据库来达到攻击目的。为了防止SQL注入攻击,PHP自带一个功能可以对输入的字符串进行处理,可以在较底层对输入进行安全上的初步处理,也即Magic Quotes。(php.ini magic_quotes_gpc)。如果magic_quotes_gpc选项启用,那么输入的字符串中的单引号,双引号和其它一些字符前将会被自动加上反斜杠\。

 但Magic Quotes并不是一个很通用的解决方案,没能屏蔽所有有潜在危险的字符,并且在许多服务器上Magic Quotes并没有被启用。所以,我们还需要使用其它多种方法来防止SQL注入。

 许多数据库本身就提供这种输入数据处理功能。例如PHP的MySQL操作函数中有一个叫mysql_real_escape_string()的函数,可将特殊字符和可能引起数据库操作出错的字符转义。

 看这段代码:

//如果Magic Quotes功用启用 
if (get_magic_quotes_gpc()) { 
$name = stripslashes($name); 
}else{ 
$name = mysql_real_escape_string($name); 
} mysql_query("SELECT * FROM users WHERE name='{$name}'");

 注意,在我们使用数据库所带的功能之前要判断一下Magic Quotes是否打开,就像上例中那样,否则两次重复处理就会出错。如果MQ已启用,我们要把加上的\去掉才得到真实数据。

 除了对以上字符串形式的数据进行预处理之外,储存Binary数据到数据库中时,也要注意进行预处理。否则数据可能与数据库自身的存储格式相冲突,引起数据库崩溃,数据记录丢失,甚至丢失整个库的数据。有些数据库如 PostgreSQL,提供一个专门用来编码二进制数据的函数pg_escape_bytea(),它可以对数据进行类似于Base64那样的编码。

 如:

// for plain-text data use: 
pg_escape_string($regular_strings); // for binary data use: 
pg_escape_bytea($binary_data);

 另一种情况下,我们也要采用这样的机制。那就是数据库系统本身不支持的多字节语言如中文,日语等。其中有些的ASCII范围和二进制数据的范围重叠。

 不过对数据进行编码将有可能导致像LIKE abc% 这样的查询语句失效。

PHP 相关文章推荐
一个多文件上传的例子(原创)
Oct 09 PHP
php采集速度探究总结(原创)
Apr 18 PHP
深入理解PHP原理之异常机制
Aug 21 PHP
PHP图片验证码制作实现分享(全)
May 10 PHP
分享一个PHP数据流应用的简单例子
Jun 01 PHP
php+mysqli实现将数据库中一张表信息打印到表格里的方法
Jan 28 PHP
PHP+APACHE实现网址伪静态
Feb 22 PHP
php简单判断文本编码的方法
Jul 30 PHP
PHP YII框架开发小技巧之模型(models)中rules自定义验证规则
Nov 16 PHP
PHP用continue跳过本次循环中剩余代码的注意点
Jun 27 PHP
PHP goto语句用法实例
Aug 06 PHP
php异常处理捕获错误整理
Sep 23 PHP
php中判断字符串是否全是中文或含有中文的实现代码
Sep 16 #PHP
php中模拟POST传递数据的两种方法分享
Sep 16 #PHP
php中获得视频时间总长度的另一种方法
Sep 15 #PHP
利用Ffmpeg获得flv视频缩略图和视频时间的代码
Sep 15 #PHP
Sorting Array Values in PHP(数组排序)
Sep 15 #PHP
PHP 图片上传代码
Sep 13 #PHP
php中json_encode中文编码问题分析
Sep 13 #PHP
You might like
数据库的日期格式转换
2006/10/09 PHP
单一index.php实现PHP任意层级文件夹遍历(Zjmainstay原创)
2012/07/31 PHP
微信公众平台接口开发入门示例
2014/12/24 PHP
php从csv文件读取数据并输出到网页的方法
2015/03/14 PHP
PHP使用mysql_fetch_row查询获得数据行列表的方法
2015/03/18 PHP
编写PHP程序检查字符串中的中文字符个数的实例分享
2016/03/17 PHP
基于ThinkPHP5框架使用QueryList爬取并存入mysql数据库操作示例
2019/05/25 PHP
php多进程应用场景实例详解
2019/07/22 PHP
jquery中获取元素的几种方式小结
2011/07/05 Javascript
深入理解JavaScript系列(6) 强大的原型和原型链
2012/01/15 Javascript
使用Jquery获取带特殊符号的ID 标签的方法
2014/04/30 Javascript
12306验证码破解思路分享
2015/03/25 Javascript
原生js实现类似弹窗抖动效果
2015/04/02 Javascript
Jquery ajax基础教程
2015/11/20 Javascript
angularJS+requireJS实现controller及directive的按需加载示例
2017/02/20 Javascript
js实现简单的选项卡效果
2017/02/23 Javascript
vue+vue-router转场动画的实例代码
2018/09/01 Javascript
详解ESLint在Vue中的使用小结
2018/10/15 Javascript
react实现同页面三级跳转路由布局
2019/09/26 Javascript
基于脚手架创建Vue项目实现步骤详解
2020/08/03 Javascript
针对Vue路由history模式下Nginx后台配置操作
2020/10/22 Javascript
[00:10]DOTA2 TI9勇士令状明日上线
2019/05/07 DOTA
Python中__new__与__init__方法的区别详解
2015/05/04 Python
python 远程统计文件代码分享
2015/05/14 Python
Python3遍历目录树实现方法
2015/05/22 Python
Python timeit模块的使用实践
2020/01/13 Python
详解HTML5布局和HTML5标签
2020/10/26 HTML / CSS
什么是servlet链?
2014/07/13 面试题
中医药大学市场营销专业自荐信
2013/09/29 职场文书
社区工作感言
2014/02/21 职场文书
乡镇办公室工作决心书
2014/03/11 职场文书
电视节目策划方案
2014/05/16 职场文书
工作时间擅自离岗检讨书
2014/10/24 职场文书
调任通知
2015/04/21 职场文书
描述鲁迅的名言整理,一生受用
2019/08/08 职场文书
给numpy.array增加维度的超简单方法
2021/06/02 Python