用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 相关文章推荐
浅谈Windows下 PHP4.0与oracle 8的连接设置
Oct 09 PHP
PHP反射类ReflectionClass和ReflectionObject的使用方法
Nov 13 PHP
php中in_array函数用法分析
Nov 15 PHP
php对数组内元素进行随机调换的方法
May 12 PHP
PHP中Restful api 错误提示返回值实现思路
Apr 12 PHP
zend framework重定向方法小结
May 28 PHP
PHP中header函数的用法及其注意事项详解
Jun 13 PHP
使用ThinkPHP生成缩略图及显示
Apr 27 PHP
php使用环形链表解决约瑟夫问题完整示例
Aug 07 PHP
浅谈laravel-admin form中的数据,在提交后,保存前,获取并进行编辑
Oct 21 PHP
设定php简写功能的方法
Nov 28 PHP
php 使用 __call实现重载功能示例
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生成html分页列表的代码
2007/03/18 PHP
PHP 数组遍历方法大全(foreach,list,each)
2010/06/30 PHP
PHP调用Linux的命令行执行文件压缩命令
2013/01/27 PHP
php静态文件返回304技巧分享
2015/01/06 PHP
教大家制作简单的php日历
2015/11/17 PHP
关于JS中的闭包浅谈
2013/08/23 Javascript
解决jquery1.9不支持browser对象的问题
2013/11/13 Javascript
js闭包引起的事件注册问题介绍
2016/03/29 Javascript
AnjularJS中$scope和$rootScope的区别小结
2016/09/18 Javascript
详解webpack之scss和postcss-loader的配置
2018/01/09 Javascript
JavaScript 高性能数组去重的方法
2018/09/20 Javascript
JavaScript ES6箭头函数使用指南
2018/12/30 Javascript
node运行js获得输出的三种方式示例详解
2020/07/02 Javascript
php使用递归与迭代实现快速排序示例
2014/01/23 Python
详解Python中for循环是如何工作的
2017/06/30 Python
深入理解Django-Signals信号量
2019/02/19 Python
numpy.meshgrid()理解(小结)
2019/08/01 Python
opencv3/C++ 平面对象识别&amp;透视变换方式
2019/12/11 Python
Python Des加密解密如何实现软件注册码机器码
2020/01/08 Python
python统计字符的个数代码实例
2020/02/07 Python
python实现飞机大战项目
2020/03/11 Python
计算机应用专业学生的自我评价分享
2013/11/03 职场文书
记帐员岗位责任制
2014/02/08 职场文书
幼儿园春季开学寄语
2014/04/03 职场文书
企业安全生产演讲稿
2014/05/09 职场文书
领导干部贪图享乐整改措施
2014/09/21 职场文书
群众路线教育实践活动学习心得体会
2014/10/30 职场文书
2015年办公室文秘工作总结
2015/04/30 职场文书
2015年公司保安年终工作总结
2015/05/14 职场文书
背起爸爸上学观后感
2015/06/08 职场文书
三年级作文之趣事作文
2019/11/04 职场文书
CSS3点击按钮圆形进度打钩效果的实现代码
2021/03/30 HTML / CSS
Python如何识别银行卡卡号?
2021/06/10 Python
关于CentOS 8 搭建MongoDB4.4分片集群的问题
2021/10/24 MongoDB
10大幻兽系恶魔果实 蝙蝠果实上榜,第一自愈能力强
2022/03/18 日漫
spring boot实现文件上传
2022/08/14 Java/Android