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(8) php 数组
Mar 05 PHP
PHP把空格、换行符、中文逗号等替换成英文逗号的正则表达式
May 04 PHP
php使用pdo连接mssql server数据库实例
Dec 25 PHP
php将12小时制转换成24小时制的方法
Mar 31 PHP
详解PHP+AJAX无刷新分页实现方法
Nov 03 PHP
php操纵mysqli数据库的实现方法
Sep 18 PHP
PHP查看SSL证书信息的方法
Sep 22 PHP
CI框架无限级分类+递归的实现代码
Nov 01 PHP
PHP实现防盗链的方法分析
Jul 25 PHP
laravel5.1 ajax post 传值_token示例
Oct 24 PHP
PHP PDO和消息队列的个人理解与应用实例分析
Nov 25 PHP
Laravel框架下的Contracts契约详解
Mar 17 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/09/17 PHP
Laravel 5.4因特殊字段太长导致migrations报错的解决
2017/10/22 PHP
dess中一个简单的多路委托的实现
2010/07/20 Javascript
使用JavaScript检测Firefox浏览器是否启用了Firebug的代码
2010/12/28 Javascript
自己动手开发jQuery插件教程
2011/08/25 Javascript
jquery对ajax的支持介绍
2013/12/10 Javascript
关闭浏览器窗口弹出提示框并且可以控制其失效
2014/04/15 Javascript
原生Javascript封装的一个AJAX函数分享
2014/10/11 Javascript
jquery中one()方法的用法实例
2015/01/16 Javascript
关于验证码在IE中不刷新的快速解决方法
2016/09/23 Javascript
nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
2016/12/30 NodeJs
vue实现添加标签demo示例代码
2017/01/21 Javascript
PHP 实现一种多文件上传的方法
2017/09/20 Javascript
JavaScript 自定义事件之我见
2017/09/25 Javascript
jquery ui 实现 tab标签功能示例【测试可用】
2019/07/25 jQuery
React传值 组件传值 之间的关系详解
2019/08/26 Javascript
layui扩展上传组件模拟进度条的方法
2019/09/23 Javascript
[02:43]2014DOTA2国际邀请赛 官方Alliance战队纪录片
2014/07/14 DOTA
[02:01]大师之路——DOTA2完美大师赛11月论剑上海
2017/11/06 DOTA
解决pyqt中ui编译成窗体.py中文乱码的问题
2016/12/23 Python
Python实现的文本简单可逆加密算法示例
2017/05/18 Python
python实现requests发送/上传多个文件的示例
2018/06/04 Python
python 检查是否为中文字符串的方法
2018/12/28 Python
Python正则表达式学习小例子
2020/03/03 Python
浅析Python 序列化与反序列化
2020/08/05 Python
Python map及filter函数使用方法解析
2020/08/06 Python
python3.8动态人脸识别的实现示例
2020/09/21 Python
HTML5触摸事件实现移动端简易进度条的实现方法
2018/05/04 HTML / CSS
Marmot土拨鼠官网:美国专业户外运动品牌
2018/01/11 全球购物
尽职尽责村干部自我鉴定
2014/01/23 职场文书
绘画专业自荐信范文
2014/02/23 职场文书
人力资源管理系自荐信
2014/05/31 职场文书
2015年学校后勤工作总结
2015/04/08 职场文书
《没有任何借口》读后感:完美的执行能力
2020/01/07 职场文书
python机器学习创建基于规则聊天机器人过程示例详解
2021/11/02 Python
MySQL新手入门进阶语句汇总
2022/09/23 MySQL