用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 相关文章推荐
使用数据库保存session的方法
Oct 09 PHP
实用函数2
Nov 08 PHP
php中根据某年第几天计算出日期年月日的代码
Feb 24 PHP
基于php在各种web服务器的运行模式详解
Jun 03 PHP
php模拟服务器实现autoindex效果的方法
Mar 10 PHP
php中有关合并某一字段键值相同的数组合并的改进
Mar 10 PHP
WAMP环境中扩展oracle函数库(oci)
Jun 26 PHP
php实现的任意进制互转类分享
Jul 07 PHP
php好代码风格的阶段性总结
Jun 25 PHP
解决PHP 7编译安装错误:cannot stat ‘phar.phar’: No such file or directory
Feb 25 PHP
PHP Socket网络操作类定义与用法示例
Aug 30 PHP
PHP实现创建一个RPC服务操作示例
Feb 23 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 传值赋值与引用赋值的区别
2010/12/29 PHP
配置php网页显示各种语法错误
2013/09/23 PHP
php 5.6版本中编写一个PHP扩展的简单示例
2015/01/20 PHP
深入浅析Yii admin的权限控制
2016/08/31 PHP
无语,javascript居然支持中文(unicode)编程!
2007/04/12 Javascript
使用JQuery和s3captche实现一个水果名字的验证
2009/08/14 Javascript
jQuery 方法大全方便学习参考
2010/02/25 Javascript
js chrome浏览器判断代码
2010/03/28 Javascript
cnblogs 代码高亮显示后的代码复制问题解决实现代码
2011/12/14 Javascript
js 浏览器事件介绍
2012/03/30 Javascript
javascript学习笔记(七) js函数介绍
2012/06/19 Javascript
IE的fireEvent方法概述及应用
2013/02/22 Javascript
JS实现倒计时和文字滚动的效果实例
2014/10/29 Javascript
JS简单测试循环运行时间的方法
2016/09/04 Javascript
JavaScript 中的12种循环遍历方法【总结】
2018/05/31 Javascript
js中this的指向问题归纳总结
2018/11/28 Javascript
使用koa2创建web项目的方法步骤
2019/03/12 Javascript
微信小程序 image组件遇到的问题
2019/05/28 Javascript
基于JS实现简单滑块拼图游戏
2019/10/12 Javascript
Vue循环中多个input绑定指定v-model实例
2020/08/31 Javascript
[38:32]完美世界DOTA2联赛循环赛 Forest vs DM 第二场 11.06
2020/11/06 DOTA
python解析模块(ConfigParser)使用方法
2013/12/10 Python
python代码制作configure文件示例
2014/07/28 Python
python实现的简单猜数字游戏
2015/04/04 Python
Python中的深拷贝和浅拷贝详解
2015/06/03 Python
python Qt5实现窗体跟踪鼠标移动
2019/12/13 Python
30行Python代码实现高分辨率图像导航的方法
2020/05/22 Python
Javascript 高级手势使用介绍
2013/04/21 HTML / CSS
皇家阿尔伯特英国官方商店:Royal Albert骨瓷
2019/03/25 全球购物
法人代表身份证明书及授权委托书
2014/09/16 职场文书
民主生活会批评与自我批评总结
2014/10/17 职场文书
委托函范文
2015/01/29 职场文书
python 如何将两个实数矩阵合并为一个复数矩阵
2021/05/19 Python
Python selenium模拟网页点击爬虫交管12123违章数据
2021/05/26 Python
MySQL系列之四 SQL语法
2021/07/02 MySQL
MYSQL常用函数介绍
2022/05/05 MySQL