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通过COM使用ADODB的简单例子
Dec 31 PHP
浅谈PHP变量作用域以及地址引用问题
Dec 27 PHP
PHP获取文件相对路径的方法
Feb 26 PHP
php实现的简单美国商品税计算函数
Jul 13 PHP
求帮忙修改个php curl模拟post请求内容后并下载文件的解决思路
Sep 20 PHP
Yii2中关联查询简单用法示例
Aug 10 PHP
php array_values 返回数组的所有值详解及实例
Nov 12 PHP
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
Dec 14 PHP
PHP实现压缩图片尺寸并转为jpg格式的方法示例
May 10 PHP
php计数排序算法的实现代码(附四个实例代码)
Mar 31 PHP
PHP笛卡尔积实现原理及代码实例
Dec 09 PHP
PHP哈希表实现算法原理解析
Dec 11 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
mysql建立外键
2006/11/25 PHP
php代码把全角数字转为半角数字
2007/12/10 PHP
PHP实现的简单网络硬盘
2015/07/29 PHP
PHP7新特性
2021/03/09 PHP
javascript 主动派发事件总结
2011/08/09 Javascript
jQuery插件slider实现拖动滑块选取价格范围
2015/04/30 Javascript
浅谈javascript的Array.prototype.slice.call
2015/08/31 Javascript
js中实现字符串和数组的相互转化详解
2016/01/24 Javascript
javascript如何创建对象
2016/08/29 Javascript
JavaScript 闭包机制详解及实例代码
2016/10/10 Javascript
微信小程序组件之srcoll-view的详解
2017/10/19 Javascript
vue-cli + sass 的正确打开方式图文详解
2017/10/27 Javascript
nodejs+express搭建多人聊天室步骤
2018/02/12 NodeJs
浅析vue给不同环境配置不同打包命令
2018/08/17 Javascript
node实现分片下载的示例代码
2018/10/17 Javascript
react 应用多入口配置及实践总结
2018/10/17 Javascript
vue集成一个支持图片缩放拖拽的富文本编辑器
2021/01/29 Vue.js
编写Python脚本批量下载DesktopNexus壁纸的教程
2015/05/06 Python
python中partial()基础用法说明
2018/12/30 Python
关于windows下Tensorflow和pytorch安装教程
2020/02/04 Python
python实现从尾到头打印单链表操作示例
2020/02/22 Python
利用Python实现Json序列化库的方法步骤
2020/09/09 Python
Windows下pycharm安装第三方库失败(通用解决方案)
2020/09/17 Python
Python pip 常用命令汇总
2020/10/19 Python
python Timer 类使用介绍
2020/12/28 Python
python切片作为占位符使用实例讲解
2021/02/17 Python
美国在线鲜花速递:ProFlowers
2017/01/05 全球购物
Arti-shopping中文官网:大型海外商品一站式直邮平台
2020/03/23 全球购物
售后服务承诺书范文
2014/03/26 职场文书
2014年秘书工作总结
2014/11/25 职场文书
房地产公司财务总监岗位职责
2015/04/03 职场文书
审查起诉阶段律师意见书
2015/05/19 职场文书
简爱读书笔记
2015/06/26 职场文书
解决Golang中ResponseWriter的一个坑
2021/04/27 Golang
spring boot项目application.properties文件存放及使用介绍
2021/06/30 Java/Android
Flask使用SQLAlchemy实现持久化数据
2021/07/16 Python