用PHP函数解决SQL injection


Posted in PHP onDecember 09, 2006

SQL injection问题在ASP上可是闹得沸沸扬扬?当然还有不少国内外著名的PHP程序“遇难”。至于SQL injection的详情,网上的文章太多了,在此就不作介绍。
如果你网站空间的php.ini文件里的magic_quotes_gpc设成了off,那么PHP就不会在敏感字符前加上反斜杠(\),由于表单提交的内容可能含有敏感字符,如单引号('),就导致了SQL injection的漏洞。在这种情况下,我们可以用addslashes()来解决问题,它会自动在敏感字符前添加反斜杠。
但是,上面的方法只适用于magic_quotes_gpc=Off的情况。作为一个开发者,你不知道每个用户的magic_quotes_gpc是On还是Off,如果把全部的数据都用上addslashes(),那不是“滥杀无辜”了?假如magic_quotes_gpc=On,并且又用了addslashes()函数,那让我们来看看: 

<?php  
//如果从表单提交一个变量$_POST['message'],内容为 Tom's book  
//这此加入连接MySQL数据库的代码,自己写吧  
//在$_POST['message']的敏感字符前加上反斜杠  
$_POST['message'] = addslashes($_POST['message']);  //由于magic_quotes_gpc=On,所以又一次在敏感字符前加反斜杠  
$sql = "INSERT INTO msg_table VALUE('$_POST[message]');";  
//发送请求,把内容保存到数据库内  
$query = mysql_query($sql);  
//如果你再从数据库内提取这个记录并输出,就会看到 Tom\'s book  
?> 

这样的话,在magic_quotes_gpc=On的环境里,所有输入的单引号(')都会变成(\')……
其实我们可以用get_magic_quotes_gpc()函数轻易地解决这个问题。当magic_quotes_gpc=On时,该函数返回TRUE;当magic_quotes_gpc=Off时,返回FALSE。至此,肯定已经有不少人意识到:问题已经解决。请看代码: 

<?php  
//如果magic_quotes_gpc=Off,那就为提单提交的$_POST['message']里的敏感字符加反斜杠  
//magic_quotes_gpc=On的情况下,则不加  
if (!get_magic_quotes_gpc()) {  
$_POST['message'] = addslashes($_POST['message']);  
} else {}  
?> 

其实说到这里,问题已经解决。下面再说一个小技巧。
有时表单提交的变量不止一个,可能有十几个,几十个。那么一次一次地复制/粘帖addslashes(),是否麻烦了一点?由于从表单或URL获取的数据都是以数组形式出现的,如$_POST、$_GET)?那就自定义一个可以“横扫千军”的函数: 
<?php  
function quotes($content)  
{  
//如果magic_quotes_gpc=Off,那么就开始处理  
if (!get_magic_quotes_gpc()) {  
//判断$content是否为数组  
if (is_array($content)) {  
//如果$content是数组,那么就处理它的每一个单无  
foreach ($content as $key=>$value) {  
$content[$key] = addslashes($value);  
}  
} else {  
//如果$content不是数组,那么就仅处理一次  
addslashes($content);  
}  
} else {  
//如果magic_quotes_gpc=On,那么就不处理  
}  
//返回$content  
return $content;  
}  
?> 

这个应该还是有问题的吧,因为$_GET里面的数组的元素也还可能
是数组,所以还是要递归调用,这个vbb中有个function.php里面这
个函数用得比较全面
function quotes($content){ 
if (!get_magic_quotes_gpc()) { 
if(is_array($content)) { 
foreach ($content as $key=>$value){ 
$content[$key] = quotes($value); 
} 
} else{ 
addslashes($content); 
} 
} 
return$content; 
} function unquotes($content){ 
if(get_magic_quotes_gpc()) { 
if (is_array($content)) { 
foreach($content as $key=>$value) { 
$content[$key] =unquotes($value); 
} 
} else{ 
stripslashes($content); 
} 
} 
return$content; 
}
PHP 相关文章推荐
我用php+mysql写的留言本
Oct 09 PHP
PHP学习资料汇总与网址
Mar 16 PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装(win+linux)
May 05 PHP
php列出一个目录下的所有文件的代码
Oct 09 PHP
php中session退出登陆问题
Feb 27 PHP
ThinkPHP CURD方法之page方法详解
Jun 18 PHP
PHP解压tar.gz格式文件的方法
Feb 14 PHP
php处理单文件、多文件上传代码分享
Aug 24 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
Jul 19 PHP
php+javascript实现的动态显示服务器运行程序进度条功能示例
Aug 07 PHP
PHP进阶学习之类的自动加载机制原理分析
Jun 18 PHP
Yii框架 session 数据库存储操作方法示例
Nov 18 PHP
php中处理模拟rewrite 效果
Dec 09 #PHP
如何写php程序?
Dec 08 #PHP
IIS下配置Php+Mysql+zend的图文教程
Dec 08 #PHP
从网上搜到的phpwind 0day的代码
Dec 07 #PHP
ajax缓存问题解决途径
Dec 06 #PHP
数字转英文
Dec 06 #PHP
?生?D片??C字串
Dec 06 #PHP
You might like
PHP编码规范-php coding standard
2007/03/16 PHP
php 删除数组元素
2009/01/16 PHP
PHP中的错误处理、异常处理机制分析
2012/05/07 PHP
解析在apache里面给php写虚拟目录的详细方法
2013/06/24 PHP
PHP mkdir()无写权限的问题解决方法
2014/06/19 PHP
PHP大神的十大优良习惯
2016/09/14 PHP
php实现微信模拟登陆、获取用户列表及群发消息功能示例
2017/06/28 PHP
laravel5表单唯一验证的实例代码
2019/09/30 PHP
Avengerls vs KG BO3 第二场2.18
2021/03/10 DOTA
jquery通过ajax加载一段文本内容的方法
2015/01/15 Javascript
JS实现单行文字不间断向上滚动的方法
2015/01/29 Javascript
javascript实现通过表格绘制颜色填充矩形的方法
2015/04/21 Javascript
Bootstrap 组件之按钮(二)
2016/05/11 Javascript
JS原生数据双向绑定实现代码
2017/08/14 Javascript
详解ES6之async+await 同步/异步方案
2017/09/19 Javascript
Node.js使用Angular简单示例
2018/05/11 Javascript
vuex+axios+element-ui实现页面请求loading操作示例
2020/02/02 Javascript
9个JavaScript日常开发小技巧
2020/10/06 Javascript
python函数形参用法实例分析
2015/08/04 Python
Python实现Sqlite将字段当做索引进行查询的方法
2016/07/21 Python
详解python脚本自动生成需要文件实例代码
2017/02/04 Python
python3+PyQt5重新实现QT事件处理程序
2018/04/19 Python
wxPython实现窗口用图片做背景
2018/04/25 Python
kafka-python批量发送数据的实例
2018/12/27 Python
浅谈Python爬虫基本套路
2019/03/25 Python
使用Python制作简单的小程序IP查看器功能
2019/04/16 Python
使用Python给头像戴上圣诞帽的图像操作过程解析
2019/09/20 Python
python使用布隆过滤器的实现示例
2020/08/20 Python
EJB的基本架构
2016/09/22 面试题
自我评价优秀范文分享
2013/11/30 职场文书
小学三年级语文教学反思
2016/03/03 职场文书
Vue详细的入门笔记
2021/05/10 Vue.js
手把手教你实现PyTorch的MNIST数据集
2021/06/28 Python
Go语言基础知识点介绍
2021/07/04 Golang
《火纹风花雪月无双》预告“神秘雇佣兵” 紫发剑客
2022/04/13 其他游戏
永中文档在线转换预览基于nginx配置部署方案
2022/06/10 Servers