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 相关文章推荐
计数器详细设计
Oct 09 PHP
深入解析PHP中的(伪)多线程与多进程
Jul 01 PHP
服务器变量 $_SERVER 的深入解析
Jul 02 PHP
Smarty日期时间操作方法示例
Nov 15 PHP
Thinkphp实现站点静态化的方法详解
Mar 21 PHP
PHP编程实现微信企业向用户付款的方法示例
Jul 26 PHP
Laravel中的Auth模块详解
Aug 17 PHP
PHP的PDO大对象(LOBs)
Jan 27 PHP
PHP小程序支付功能完整版【基于thinkPHP】
Mar 26 PHP
thinkPHP5框架实现多数据库连接,跨数据连接查询操作示例
May 29 PHP
Laravel 解决composer相关操作提示php相关异常的问题
Oct 23 PHP
PHP7 新增功能
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
二十行语句实现从Excel到mysql的转化
2006/10/09 PHP
在普通HTTP上安全地传输密码
2007/07/21 PHP
PHP header()函数使用详细(301、404等错误设置)
2013/04/17 PHP
php绘图之在图片上写中文和英文的方法
2015/01/24 PHP
php从数据库中读取特定的行(实例)
2017/06/02 PHP
jquery 插件 web2.0分格的分页脚本,可用于ajax无刷新分页
2008/12/25 Javascript
js 表单验证方法(实用)
2009/04/28 Javascript
提示$ is not defined错误分析及解决
2013/04/09 Javascript
jquery和javascript中如何将一元素的内容赋给另一元素
2014/01/09 Javascript
JS实现鼠标单击与双击事件共存
2014/03/08 Javascript
javascript常见用法总结
2014/05/22 Javascript
JavaScript获得当前网页来源页面(即上一页)的方法
2015/04/03 Javascript
jQuery实现可关闭固定于底(顶)部的工具条菜单效果
2015/11/06 Javascript
jQuery获取及设置表单input各种类型值的方法小结
2016/05/24 Javascript
Vue的click事件防抖和节流处理详解
2019/11/13 Javascript
[37:21]完美世界DOTA2联赛PWL S2 Inki vs Magma 第二场 11.22
2020/11/24 DOTA
忘记ftp密码使用python ftplib库暴力破解密码的方法示例
2014/01/22 Python
python 多维切片之冒号和三个点的用法介绍
2018/04/19 Python
OpenCV+python手势识别框架和实例讲解
2018/08/03 Python
对django 模型 unique together的示例讲解
2019/08/06 Python
python剪切视频与合并视频的实现
2020/03/03 Python
Python logging模块写入中文出现乱码
2020/05/21 Python
Python selenium键盘鼠标事件实现过程详解
2020/07/28 Python
Pycharm 解决自动格式化冲突的设置操作
2021/01/15 Python
python元组拆包实现方法
2021/02/28 Python
html5 canvas实现给图片添加平铺水印
2019/08/20 HTML / CSS
梅西酒窖:Macy’s Wine Cellar
2018/01/07 全球购物
美国伊甸园兄弟种子公司:Eden Brothers
2018/07/01 全球购物
高级文秘工作总结的自我评价
2013/09/28 职场文书
小学生竞选班长演讲稿
2014/04/24 职场文书
2014院党委领导班子对照检查材料思想汇报
2014/09/24 职场文书
面试通知邮件
2015/04/20 职场文书
2019消防宣传标语!
2019/07/10 职场文书
python 爬取豆瓣网页的示例
2021/04/13 Python
python源码剖析之PyObject详解
2021/05/18 Python
Qt数据库应用之实现图片转pdf
2022/06/01 Java/Android