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 相关文章推荐
用PHP4访问Oracle815
Oct 09 PHP
生成sessionid和随机密码的例子
Oct 09 PHP
探讨多键值cookie(php中cookie存取数组)的详解
Jun 06 PHP
利用phpExcel实现Excel数据的导入导出(全步骤详细解析)
Nov 26 PHP
PHP的魔术常量__METHOD__简介
Jul 08 PHP
qq登录,新浪微博登录接口申请过程中遇到的问题
Jul 22 PHP
php实现比较两个文件夹异同的方法
Jun 18 PHP
php简单实现多语言切换的方法
May 09 PHP
php实现的三个常用加密解密功能函数示例
Nov 06 PHP
php curl获取https页面内容,不直接输出返回结果的设置方法
Jan 15 PHP
PHP CURL使用详解
Mar 21 PHP
PHP实现简单的计算器
Aug 28 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
全国FM电台频率大全 - 8 黑龙江省
2020/03/11 无线电
重量级动漫纷纷停播!唯独OVERLORD第四季正在英魂之刃继续更新
2020/05/06 日漫
php中in_array函数用法探究
2014/11/25 PHP
php curl 上传文件代码实例
2015/04/27 PHP
PHP长连接实现与使用方法详解
2018/02/11 PHP
PHP bin2hex()函数基础实例讲解
2019/02/11 PHP
基于JQuery.timer插件实现一个计时器
2010/04/25 Javascript
js加强的经典分页实例
2013/03/15 Javascript
js原型继承的两种方法对比介绍
2014/03/30 Javascript
jQuery实现隔行背景色变色
2014/11/24 Javascript
readonly和disabled属性的区别
2015/07/26 Javascript
jQuery包裹节点用法完整示例
2016/09/13 Javascript
D3.js实现饼状图的方法详解
2016/09/21 Javascript
Vue2 Vue-cli中使用Typescript的配置详解
2017/07/24 Javascript
Angular2 组件间通过@Input @Output通讯示例
2017/08/24 Javascript
node和vue实现商城用户地址模块
2018/12/05 Javascript
Vue + ts实现轮播插件的示例
2020/11/10 Javascript
详解ES6 中的Object.assign()的用法实例代码
2021/01/11 Javascript
手动实现vue2.0的双向数据绑定原理详解
2021/02/06 Vue.js
Python发送Email方法实例
2014/08/21 Python
使用grappelli为django admin后台添加模板
2014/11/18 Python
PyTorch中常用的激活函数的方法示例
2019/08/20 Python
python将音频进行变速的操作方法
2020/04/08 Python
Python数组拼接np.concatenate实现过程
2020/04/18 Python
Python爬虫headers处理及网络超时问题解决方案
2020/06/19 Python
Python如何对齐字符串
2020/07/30 Python
python爬虫使用正则爬取网站的实现
2020/08/03 Python
Web页面中八种创建多列等高(等高列布局)的实现技术
2012/12/24 HTML / CSS
Html5新增标签与样式及让元素水平垂直居中
2019/07/11 HTML / CSS
工厂门卫岗位职责
2013/11/25 职场文书
学生喝酒检讨书
2014/02/06 职场文书
八一建军节演讲稿
2014/09/10 职场文书
2014年党总支工作总结
2014/12/18 职场文书
2015年高二班主任工作总结
2015/05/25 职场文书
宣传稿格式范文
2015/07/23 职场文书
基督教追悼会答谢词
2015/09/29 职场文书