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 相关文章推荐
解析阿里云ubuntu12.04环境下配置Apache+PHP+PHPmyadmin+MYsql
Jun 26 PHP
php中chdir()函数用法实例
Nov 13 PHP
PHP获取一年中每个星期的开始和结束日期的方法
Feb 12 PHP
PHP中each与list用法分析
Jan 08 PHP
PHP7安装Redis扩展教程【Linux与Windows平台】
Sep 30 PHP
thinkPHP模板中函数的使用方法示例
Nov 30 PHP
Yii2实现自定义独立验证器的方法
May 05 PHP
PHP微信企业号开发之回调模式开启与用法示例
Nov 25 PHP
浅谈PHP中pack、unpack的详细用法
Mar 12 PHP
php命名空间设计思想、用法与缺点分析
Jul 17 PHP
Thinkphp 框架扩展之驱动扩展实例分析
Apr 27 PHP
PHP 裁剪图片
Mar 09 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对表单提交特殊字符的过滤和处理方法汇总
2014/02/18 PHP
ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单
2014/05/15 PHP
给ListBox添加双击事件示例代码
2013/12/02 Javascript
JavaScript函数获取事件源的小例子
2014/05/14 Javascript
在Linux上用forever实现Node.js项目自启动
2014/07/09 Javascript
JS判断字符串变量是否含有某个字串的实现方法
2016/06/03 Javascript
jQuery模仿京东/天猫商品左侧分类导航菜单效果
2016/06/29 Javascript
Vue组件BootPage实现简单的分页功能
2016/09/12 Javascript
浅析JavaScriptSerializer类的序列化与反序列化
2016/11/22 Javascript
JavaScript中的编码和解码函数
2017/02/15 Javascript
JS仿JQuery选择器功能
2017/03/08 Javascript
Vue.js列表渲染绑定jQuery插件的正确姿势
2017/06/29 jQuery
Vue2.0父组件与子组件之间的事件发射与接收实例代码
2017/09/19 Javascript
vue 实现axios拦截、页面跳转和token 验证
2018/07/17 Javascript
Vue中使用ElementUI使用第三方图标库iconfont的示例
2018/10/11 Javascript
JS大坑之19位数的Number型精度丢失问题详解
2019/04/22 Javascript
Vue动态修改网页标题的方法及遇到问题
2019/06/09 Javascript
解决axios post 后端无法接收数据的问题
2019/10/29 Javascript
js实现滚动条自动滚动
2020/12/13 Javascript
[02:20]DOTA2中文配音宣传片
2013/05/22 DOTA
Python实现分割文件及合并文件的方法
2015/07/10 Python
Ubuntu下使用Python实现游戏制作中的切分图片功能
2018/03/30 Python
python 按不同维度求和,最值,均值的实例
2018/06/28 Python
Flask web开发处理POST请求实现(登录案例)
2018/07/26 Python
python模块和包的应用BASE_PATH使用解析
2019/12/14 Python
python GUI库图形界面开发之PyQt5滑块条控件QSlider详细使用方法与实例
2020/02/28 Python
python3 使用openpyxl将mysql数据写入xlsx的操作
2020/05/15 Python
CSS3实现淘宝留白的方法
2020/06/05 HTML / CSS
html5 viewport使用方法示例详解
2013/12/02 HTML / CSS
法国低价在线宠物商店:bitiba.fr
2020/07/03 全球购物
字符串str除首尾字符外的其他字符按升序排列
2013/03/08 面试题
AJAX都有哪些有点和缺点
2012/11/03 面试题
体育教育专业毕业生自荐信
2013/11/15 职场文书
房产代理公证处委托书
2014/04/04 职场文书
高中同学会活动方案
2014/08/14 职场文书
结婚纪念日感言
2015/08/01 职场文书