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的ob_start() 控制您的浏览器cache
Aug 03 PHP
PHP和Mysqlweb应用开发核心技术-第1部分 Php基础-2 php语言介绍
Jul 03 PHP
zend framework配置操作数据库实例分析
Dec 06 PHP
PHP禁止个别IP访问网站
Oct 30 PHP
zf框架db类的分页示例分享
Mar 14 PHP
PHP扩展模块Pecl、Pear以及Perl的区别
Apr 09 PHP
Laravel 5框架学习之数据库迁移(Migrations)
Apr 08 PHP
PHP环境搭建的详细步骤
Jun 30 PHP
PHP实现导出excel数据的类库用法示例
Oct 15 PHP
yii2实现分页,带搜索的分页功能示例
Jan 07 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
Dec 21 PHP
解决windows上php xdebug 无法调试的问题
Feb 19 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生成验证码时“图像因其本身有错无法显示”的解决方法
2013/08/07 PHP
PHP小教程之实现双向链表
2014/06/12 PHP
利用PHP命令行模式采集股票趋势信息
2016/08/09 PHP
PHP http请求超时问题解决方案
2020/11/13 PHP
javascript 屏蔽鼠标键盘的几段代码
2008/01/02 Javascript
利用js对象弹出一个层
2008/03/26 Javascript
JavaScript高级程序设计 阅读笔记(二十) js错误处理
2012/08/14 Javascript
JS实现金额转换(将输入的阿拉伯数字)转换成中文的实现代码
2013/09/30 Javascript
jQuery替换textarea中换行的方法
2015/06/10 Javascript
javascript中类的定义方式详解(四种方式)
2015/12/22 Javascript
AngularJS内建服务$location及其功能详解
2016/07/01 Javascript
AngularJS教程之环境设置
2016/08/16 Javascript
Angular下H5上传图片的方法(可多张上传)
2017/01/09 Javascript
JQueryMiniUI按照时间进行查询的实现方法
2017/06/07 jQuery
Bootstrap Multiselect 常用组件实现代码
2017/07/09 Javascript
利用javascript如何随机生成一定位数的密码
2017/09/22 Javascript
浅谈vue路径优化之resolve
2017/10/13 Javascript
发布一款npm包帮助理解npm的使用
2019/01/03 Javascript
完美解决vue 中多个echarts图表自适应的问题
2020/07/19 Javascript
vue移动端弹起蒙层滑动禁止底部滑动操作
2020/07/22 Javascript
vue的webcamjs集成方式
2020/11/16 Javascript
Python实现的一个简单LRU cache
2014/09/26 Python
深入解析Python中的__builtins__内建对象
2016/06/21 Python
遗传算法python版
2018/03/19 Python
Python使用xlwt模块操作Excel的方法详解
2018/03/27 Python
python指定写入文件时的编码格式方法
2018/06/07 Python
Django实现whoosh搜索引擎使用jieba分词
2020/04/08 Python
python如何提升爬虫效率
2020/09/27 Python
个人自我鉴定怎么写
2013/10/28 职场文书
高中生毕业自我鉴定范文
2013/12/22 职场文书
机关驾驶员违规检讨书
2014/09/13 职场文书
个人先进事迹材料
2014/12/29 职场文书
催款通知书范文
2015/04/17 职场文书
第二次离婚起诉书
2015/05/18 职场文书
SQL实现LeetCode(180.连续的数字)
2021/08/04 MySQL
分享很少见很有用的SQL功能CORRESPONDING
2022/08/05 MySQL