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 相关文章推荐
mysql中存储过程、函数的一些问题
Feb 14 PHP
简化php模板页面中分页代码的解析
Feb 06 PHP
php 获取mysql数据库信息代码
Mar 12 PHP
php设计模式 Builder(建造者模式)
Jun 26 PHP
Uncaught exception com_exception with message Failed to create COM object
Jan 11 PHP
使用php测试硬盘写入速度示例
Jan 27 PHP
PHP函数func_num_args用法实例分析
Dec 07 PHP
微信 开发生成带参数的二维码的实例
Nov 23 PHP
php readfile()修改文件上传大小设置
Aug 11 PHP
php高清晰度无损图片压缩功能的实现代码
Dec 09 PHP
在Laravel的Model层做数据缓存的实现
Sep 26 PHP
在laravel框架中实现封装公共方法全局调用
Oct 14 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和.net中des加解密的实现方法
2013/02/27 PHP
Django中的cookie与session操作实例代码
2017/08/17 PHP
Ajax+PHP实现的分类列表框功能示例
2019/02/11 PHP
php用户名的密码加密更安全的方法
2019/06/21 PHP
Yii框架页面渲染操作实例详解
2019/07/19 PHP
utf-8编码引起js输出中文乱码的解决办法
2010/06/23 Javascript
JavaScript和ActionScript的交互实现代码
2010/08/01 Javascript
Javascript中的call()方法介绍
2015/03/15 Javascript
javascript作用域链(Scope Chain)用法实例解析
2015/11/30 Javascript
JavaScript基础知识之方法汇总结
2016/01/24 Javascript
三种Node.js写文件的方式
2016/03/08 Javascript
深入理解jQuery之防止冒泡事件
2016/05/24 Javascript
jQuery插件passwordStrength密码强度指标详解
2016/06/24 Javascript
前端弹出对话框 js实现ajax交互
2016/09/09 Javascript
javascript淘宝主图放大镜功能
2016/10/20 Javascript
深入理解node.js http模块
2018/01/24 Javascript
JS弹窗 JS弹出DIV并使整个页面背景变暗功能的实现代码
2018/04/21 Javascript
微信小程序form表单组件示例代码
2018/07/15 Javascript
JavaScript WeakMap使用详解
2021/02/05 Javascript
[03:02]2014DOTA2西雅图邀请赛 让队员自己告诉你DK NAVI备战情况
2014/07/08 DOTA
Numpy中转置transpose、T和swapaxes的实例讲解
2018/04/17 Python
python使用Matplotlib绘制分段函数
2018/09/25 Python
Django中使用CORS实现跨域请求过程解析
2019/08/05 Python
在Python中字符串、列表、元组、字典之间的相互转换
2019/11/15 Python
Python实现隐马尔可夫模型的前向后向算法的示例代码
2019/12/31 Python
tensorflow 模型权重导出实例
2020/01/24 Python
pandas中的数据去重处理的实现方法
2020/02/10 Python
Python常用GUI框架原理解析汇总
2020/12/07 Python
纯CSS实现菜单、导航栏的3D翻转动画效果
2014/04/23 HTML / CSS
h5实现获取用户地理定位的实例代码
2017/07/17 HTML / CSS
详解html5 canvas 微信海报分享(个人爬坑)
2018/01/12 HTML / CSS
美国宠物商店:Wag.com
2016/10/25 全球购物
德国BA保镖药房中文网:Bodyguard Apotheke
2021/03/09 全球购物
生产管理的三大手法
2013/11/11 职场文书
雨花台导游词
2015/02/06 职场文书
课题研究阶段性总结
2015/08/13 职场文书