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 xml文件操作代码(一)
Mar 20 PHP
PHP 截取字符串函数整理(支持gb2312和utf-8)
Feb 16 PHP
php学习笔记(三)操作符与控制结构
Aug 06 PHP
基于PHP的简单采集数据入库程序
Jul 30 PHP
php转换颜色为其反色的方法
Apr 27 PHP
php数据访问之增删改查操作
May 09 PHP
PHP输出多个元素的排列或组合的方法
Mar 14 PHP
php实现自定义中奖项数和概率的抽奖函数示例
May 26 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
Aug 28 PHP
PHP运用foreach神奇的转换数组(实例讲解)
Feb 01 PHP
PHP多线程模拟实现秒杀抢单
Feb 07 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
经典PHP加密解密函数Authcode()修复版代码
2015/04/05 PHP
Centos 6.5系统下编译安装PHP 7.0.13的方法
2016/12/19 PHP
PHP中使用mpdf 导出PDF文件的实现方法
2018/10/22 PHP
PHP如何实现阿里云短信sdk灵活应用在项目中的方法
2019/06/14 PHP
php实现的简单多进程服务器类完整示例
2020/02/01 PHP
JavaScript库 开发规则
2009/01/31 Javascript
JS取文本框中最小值的简单实例
2013/11/29 Javascript
JavaScript多并发问题如何处理
2015/10/28 Javascript
原生js实现仿window10系统日历效果的实例
2017/10/31 Javascript
vue中如何去掉空格的方法实现
2018/11/09 Javascript
浅谈webpack+react多页面开发终极架构
2018/11/11 Javascript
详解微信小程序框架wepy踩坑记录(与vue对比)
2019/03/12 Javascript
vue数据更新UI不刷新显示的解决办法
2020/08/06 Javascript
详解vue 组件注册
2020/11/20 Vue.js
[01:55]TI9显影之尘系列 - Evil Geniuses
2019/08/22 DOTA
如何在Python函数执行前后增加额外的行为
2016/10/20 Python
Python使用pip安装pySerial串口通讯模块
2018/04/20 Python
python 读取文本文件的行数据,文件.splitlines()的方法
2018/07/12 Python
Python爬虫实现验证码登录代码实例
2019/05/10 Python
Python中的With语句的使用及原理
2020/07/29 Python
Python实现我的世界小游戏源代码
2021/03/02 Python
css3 响应式媒体查询的示例代码
2019/09/25 HTML / CSS
如何给HTML标签中的文本设置修饰线
2019/11/18 HTML / CSS
微软澳洲官方网站:Microsoft Australia
2017/01/10 全球购物
俄罗斯美容和健康网上商店:Созвездие Красоты
2019/07/23 全球购物
Weblogic和WebSphere不同特点
2012/05/09 面试题
亲戚结婚的请假条
2014/02/11 职场文书
高中打架检讨书
2014/02/13 职场文书
小溪流的歌教学反思
2014/02/13 职场文书
美术教师岗位职责
2014/03/18 职场文书
《四季》教学反思
2014/04/08 职场文书
2015年国庆节广播稿
2015/08/19 职场文书
三八红旗手主要事迹材料
2015/11/04 职场文书
2019中秋节祝福语大全,提前收藏啦
2019/09/10 职场文书
golang 接口嵌套实现复用的操作
2021/04/29 Golang
实战 快速定位MySQL的慢SQL
2022/03/22 MySQL