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 相关文章推荐
php完全过滤HTML,JS,CSS等标签
Jan 16 PHP
php date与gmdate的获取日期的区别
Feb 08 PHP
PHP操作xml代码
Jun 17 PHP
PHP+Mysql+Ajax+JS实现省市区三级联动
May 23 PHP
php生成QRcode实例
Sep 22 PHP
PHP动态编译出现Cannot find autoconf的解决方法
Nov 05 PHP
smarty模板引擎中内建函数if、elseif和else的使用方法
Jan 22 PHP
php计算指定目录下文件占用空间的方法
Mar 13 PHP
php去掉文件前几行的方法
Jul 29 PHP
PHP下载生成的csv文件及问题总结
Aug 06 PHP
一个完整的php文件上传类实例讲解
Oct 27 PHP
PHP判断文件是否被引入的方法get_included_files用法示例
Nov 29 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 socket编程
2015/05/13 PHP
php基于Snoopy解析网页html的方法
2015/07/09 PHP
一些有用的JavaScript和jQuery的片段分享
2011/08/23 Javascript
js常用代码段整理
2011/11/30 Javascript
那些年,我还在学习jquery 学习笔记
2012/03/05 Javascript
jQuery.event兼容各浏览器的event详细解析
2013/12/18 Javascript
为JS扩展Array.prototype.indexOf引发的问题及解决办法
2015/01/21 Javascript
js实现数组转换成json
2015/06/26 Javascript
jQuery的end()方法使用详解
2015/07/15 Javascript
javascript实现下拉提示选择框
2015/12/29 Javascript
jQuery获取当前点击的对象元素(实现代码)
2016/05/19 Javascript
angular ng-repeat数组中的数组实例
2017/02/18 Javascript
Django+Vue.js搭建前后端分离项目的示例
2017/08/07 Javascript
vue 粒子特效的示例代码
2017/09/19 Javascript
Node.js创建HTTP文件服务器的使用示例
2018/05/11 Javascript
利用angular自动编译andriod APK的绕坑经历分享
2019/03/08 Javascript
原生js实现trigger方法示例代码
2019/05/22 Javascript
谈谈node.js中的模块系统
2020/09/01 Javascript
[46:20]TFT vs Secret Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
详解Python爬取并下载《电影天堂》3千多部电影
2019/04/26 Python
如何在python中实现随机选择
2019/11/02 Python
python3实现elasticsearch批量更新数据
2019/12/03 Python
Python实现图像去噪方式(中值去噪和均值去噪)
2019/12/18 Python
python数据预处理 :数据共线性处理详解
2020/02/24 Python
深入浅析Python 命令行模块 Click
2020/03/11 Python
python脚本第一行如何写
2020/08/30 Python
python 无损批量压缩图片(支持保留图片信息)的示例
2020/09/22 Python
英国最大的宠物食品和宠物用品网上零售商: Zooplus
2016/08/01 全球购物
Booking.com美国:全球酒店预订网站
2017/04/18 全球购物
银行出纳岗位职责
2013/11/25 职场文书
责任担保书范文
2014/05/21 职场文书
2014年科研工作总结
2014/12/03 职场文书
工作失职检讨书范文
2015/05/05 职场文书
2015年七七事变78周年纪念活动方案
2015/05/06 职场文书
工作会议简报
2015/07/20 职场文书
CSS的class与id常用的命名规则
2021/05/18 HTML / CSS