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 相关文章推荐
打造计数器DIY三步曲(下)
Oct 09 PHP
PHP EOT定界符的使用详解
Sep 30 PHP
php设计模式 Delegation(委托模式)
Jun 26 PHP
php fsockopen伪造post与get方法的详解
Jun 14 PHP
PHP根据两点间的经纬度计算距离
Oct 31 PHP
php实现上传图片保存到数据库的方法
Feb 11 PHP
PHP编程之设置apache虚拟目录
Jul 08 PHP
利用PHP命令行模式采集股票趋势信息
Aug 09 PHP
php中文字符串截取多种方法汇总
Oct 06 PHP
关于php 高并发解决的一点思路
Apr 16 PHP
PHP7多线程搭建教程
Apr 21 PHP
php解析非标准json、非规范json的方式实例
May 10 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
ftp类(myftp.php)
2006/10/09 PHP
PHP 创建标签云函数代码
2010/05/26 PHP
浅谈PHP各环境下的伪静态配置
2019/03/13 PHP
PHP实现随机发扑克牌
2020/04/22 PHP
javascript数组组合成字符串的脚本
2021/01/06 Javascript
跟着JQuery API学Jquery 之二 属性
2010/04/09 Javascript
js实现弹窗插件功能实例代码分享
2013/12/12 Javascript
js的参数有长度限制吗?发现不能超过2083个字符
2014/04/20 Javascript
Javascript数组与字典用法分析
2014/12/13 Javascript
jQuery使用元素属性attr赋值详解
2015/02/27 Javascript
JavaScript中的依赖注入详解
2015/03/18 Javascript
jQuery插件pagewalkthrough实现引导页效果
2015/07/05 Javascript
jQuery中ajax的load()与post()方法实例详解
2016/01/05 Javascript
AngularJS常见过滤器用法实例总结
2017/07/06 Javascript
JS操作时间 - UNIX时间戳的简单介绍(必看篇)
2017/08/16 Javascript
原生JS实现移动端web轮播图详解(结合Tween算法造轮子)
2017/09/10 Javascript
对vue中的事件穿透与禁止穿透实例详解
2019/10/28 Javascript
python使用xmlrpc实例讲解
2013/12/17 Python
Python多重继承的方法解析执行顺序实例分析
2018/05/26 Python
python实现两个字典合并,两个list合并
2019/12/02 Python
Python中关于logging模块的学习笔记
2020/06/03 Python
Python configparser模块封装及构造配置文件
2020/08/07 Python
利用SVG和CSS3来实现一个炫酷的边框动画
2015/07/22 HTML / CSS
德国家具购物网站:Möbel Höffner
2019/08/26 全球购物
西安当代医院管理研究院笔试题
2015/12/11 面试题
英语专业推荐信
2013/11/16 职场文书
元旦晚会主持词
2014/03/24 职场文书
应聘英语教师求职信
2014/04/24 职场文书
2013年最新自荐信范文
2014/06/23 职场文书
毕业证丢失证明范本
2014/09/20 职场文书
2015年村级财务管理制度
2015/08/04 职场文书
节水宣传标语口号
2015/12/26 职场文书
《陶罐和铁罐》教学反思
2016/03/03 职场文书
资产移交协议书
2016/03/24 职场文书
七年级作文之雪景
2019/11/18 职场文书
vue实现简易音乐播放器
2022/08/14 Vue.js