用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 Smarty模板生成html文档的方法
Apr 12 PHP
php下使用curl模拟用户登陆的代码
Sep 10 PHP
php比较多维数组中值的大小排序实现代码
Sep 08 PHP
用PHP即时捕捉PHP中的错误并发送email通知的实现代码
Jan 19 PHP
为PHP安装imagick时出现Cannot locate header file MagickWand.h错误的解决方法
Nov 03 PHP
php程序总是提示验证码输入有误解决方案
Jan 07 PHP
php计算两个坐标(经度,纬度)之间距离的方法
Apr 17 PHP
PHP+Mysql+jQuery中国地图区域数据统计实例讲解
Oct 10 PHP
Yii编程开发常见调用技巧集锦
Jul 15 PHP
PHP实现上传图片到 zimg 服务器
Oct 19 PHP
在IIS下安装PHP扩展的方法(超简单)
Apr 10 PHP
Yii2框架实现利用mpdf创建pdf文件功能示例
Feb 08 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程序中的常见漏洞进行攻击(上)
2006/10/09 PHP
在Windows系统下使用PHP生成Word文档的教程
2015/07/03 PHP
php实现zip文件解压操作
2015/11/03 PHP
[原创]php实现 data url的图片生成与保存
2016/12/04 PHP
form自动提交实例讲解
2017/07/10 PHP
javascript高级学习笔记整理
2011/08/14 Javascript
javascript中的__defineGetter__和__defineSetter__介绍
2014/08/15 Javascript
封装好的js判断操作系统与浏览器代码分享
2015/01/09 Javascript
JS原型对象的创建方法详解
2016/06/16 Javascript
浅谈JavaScript中的this指针和引用知识
2016/08/05 Javascript
微信小程序开发之map地图实现教程
2017/06/08 Javascript
浅谈angular2路由预加载策略
2017/10/04 Javascript
微信小程序简单实现form表单获取输入数据功能示例
2017/11/30 Javascript
js获取html页面代码中图片地址的实现代码
2018/03/05 Javascript
结合Vue控制字符和字节的显示个数的示例
2018/05/17 Javascript
Javascript之高级数组API的使用实例
2019/03/08 Javascript
[12:36]《DOTA2》国服注册与激活指南全攻略
2013/04/28 DOTA
Python装饰器入门学习教程(九步学习)
2016/01/28 Python
Python matplotlib通过plt.scatter画空心圆标记出特定的点方法
2018/12/13 Python
基于wxPython的GUI实现输入对话框(2)
2019/02/27 Python
对python中不同模块(函数、类、变量)的调用详解
2019/07/16 Python
OpenCV图片漫画效果的实现示例
2020/08/18 Python
HTML5之SVG 2D入门9—蒙板及mask元素介绍与应用
2013/01/30 HTML / CSS
利用HTML5 Canvas制作一个简单的打飞机游戏
2015/05/11 HTML / CSS
英国的知名精品百货公司:House of Fraser(福来德)
2016/08/14 全球购物
HUGO BOSS美国官方网上商店:世界知名奢侈品牌
2017/08/04 全球购物
Hunkemöller瑞士网上商店:欧洲最大的内衣品牌之一
2018/12/03 全球购物
华为慧通笔试题
2016/04/22 面试题
如何在Oracle中查看各个表、表空间占用空间的大小
2015/10/31 面试题
劳动仲裁调解书
2015/05/20 职场文书
怒海潜将观后感
2015/06/11 职场文书
淮海战役观后感
2015/06/11 职场文书
HR必备:超全面的薪酬待遇管理方案!
2019/07/12 职场文书
《天净沙·秋思》教学反思三篇
2019/11/02 职场文书
redis连接被拒绝的解决方案
2021/04/12 Redis
Ruby使用Mysql2连接操作MySQL
2022/04/19 Ruby