用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入门源程序
Oct 09 PHP
PHP4实际应用经验篇(4)
Oct 09 PHP
海河写的 Discuz论坛帖子调用js的php代码
Aug 23 PHP
PHP 数据结构 算法描述 冒泡排序 bubble sort
Jul 10 PHP
php cookie使用方法学习笔记分享
Nov 07 PHP
php制作unicode解码工具(unicode编码转换器)代码分享
Dec 24 PHP
smarty内置函数capture用法分析
Jan 22 PHP
smarty模板引擎使用内建函数foreach循环取出所有数组值的方法
Jan 22 PHP
php命令行(cli)下执行PHP脚本文件的相对路径的问题解决方法
May 25 PHP
PHP 微信支付类 demo
Nov 30 PHP
PHP中的Trait 特性及作用
Apr 03 PHP
Laravel中间件实现原理详解
Oct 09 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数组转成json格式的方法
2015/03/09 PHP
PHP addcslashes()函数讲解
2019/02/03 PHP
IE6下JS动态设置图片src地址问题
2010/01/08 Javascript
基于jquery的direction图片渐变动画效果
2010/05/24 Javascript
JavaScript事件处理器中的event参数使用介绍
2013/05/24 Javascript
JS获取下拉列表所选中的TEXT和Value的实现代码
2014/01/11 Javascript
兼容各大浏览器的JavaScript阻止事件冒泡代码
2015/07/09 Javascript
jQuery form 表单验证插件(fieldValue)校验表单
2016/01/24 Javascript
JS显示日历和天气的方法
2016/03/01 Javascript
详解利用 Vue.js 实现前后端分离的RBAC角色权限管理
2017/09/15 Javascript
js中call()和apply()改变指针问题的讲解
2019/01/17 Javascript
详解mpvue中小程序自定义导航组件开发指南
2019/02/11 Javascript
Vue.use()在new Vue() 之前使用的原因浅析
2019/08/26 Javascript
Vue父子组件传值的一些坑
2020/09/16 Javascript
在react-antd中弹出层form内容传递给父组件的操作
2020/10/24 Javascript
[02:02:38]VG vs Mineski Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
python模块restful使用方法实例
2013/12/10 Python
Python3实现的画图及加载图片动画效果示例
2018/01/19 Python
简单了解python 生成器 列表推导式 生成器表达式
2019/08/22 Python
利用Python代码实现一键抠背景功能
2019/12/29 Python
python中count函数简单用法
2020/01/05 Python
Python如何实现爬取B站视频
2020/05/20 Python
详解background属性的8个属性值(面试题)
2020/11/02 HTML / CSS
全球知名的婚恋交友网站:Match.com
2017/01/05 全球购物
美国购买舞会礼服网站:Couture Candy
2019/12/29 全球购物
项目建议书范文
2014/05/12 职场文书
初一新生军训方案
2014/05/22 职场文书
廉政教育的心得体会
2014/09/01 职场文书
村长反四风问题个人对照检查材料
2014/09/21 职场文书
高中生国庆节演讲稿范文2014
2014/09/21 职场文书
优秀员工事迹材料
2014/12/20 职场文书
会计专业自荐信范文
2015/03/05 职场文书
2015年小学总务工作总结
2015/07/21 职场文书
初一军训感言
2015/08/01 职场文书
商业计划书之服装
2019/09/09 职场文书
python使用pycharm安装pyqt5以及相关配置
2022/04/22 Python