用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 相关文章推荐
模仿OSO的论坛(二)
Oct 09 PHP
php_xmlhttp 乱码问题解决方法
Aug 07 PHP
JS中encodeURIComponent函数用php解码的代码
Mar 01 PHP
php后台如何避免用户直接进入方法实例
Oct 15 PHP
php读取mysql的简单实例
Jan 15 PHP
PHP中SESSION的注销与清除
Apr 16 PHP
php编写的抽奖程序中奖概率算法
May 14 PHP
Yii 访问 Gii(脚手架)时出现 403 错误
Jun 06 PHP
PHP大文件分块上传功能实例详解
Jul 22 PHP
浅谈Laravel POST,PUT,PATCH 路由的区别
Oct 15 PHP
Laravel等框架模型关联的可用性浅析
Dec 15 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
Apr 04 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
MySQL时间字段究竟使用INT还是DateTime的说明
2012/02/27 PHP
将酷狗krc歌词解析并转换为lrc歌词php源码
2014/06/20 PHP
php通过分类列表产生分类树数组的方法
2015/04/20 PHP
PHP7创建销毁session的实例方法
2020/02/03 PHP
jQuery对象和DOM对象的相互转化实现代码
2010/03/02 Javascript
jQuery遍历Form示例代码
2013/09/03 Javascript
JQuery插件iScroll实现下拉刷新,滚动翻页特效
2014/06/22 Javascript
一个不错的js html页面倒计时可精确到秒
2014/10/22 Javascript
node.js中的fs.readFile方法使用说明
2014/12/15 Javascript
jQuery实现拖动调整表格单元格大小的代码实例
2015/01/13 Javascript
JavaScript针对网页节点的增删改查用法实例
2015/02/02 Javascript
js实现简单的左右两边固定广告效果实例
2015/04/10 Javascript
JQuery中attr方法和removeAttr方法用法实例
2015/05/18 Javascript
js设置document.domain实现跨域的注意点分析
2015/05/21 Javascript
使用javascript插入样式
2016/03/14 Javascript
详解Weex基于Vue2.0开发模板搭建
2017/03/20 Javascript
js oncontextmenu事件使用详解
2017/03/25 Javascript
Vue中封装input组件的实例详解
2017/10/17 Javascript
form表单数据封装成json格式并提交给服务器的实现方法
2017/12/14 Javascript
axios进阶实践之利用最优雅的方式写ajax请求
2017/12/20 Javascript
简述vue状态管理模式之vuex
2018/08/29 Javascript
解决echarts的多个折现数据出现坐标和值对不上的问题
2018/12/28 Javascript
python中的字典操作及字典函数
2018/01/03 Python
Python学习笔记之函数的参数和返回值的使用
2019/11/20 Python
Python实现Wordcloud生成词云图的示例
2020/03/30 Python
django 连接数据库出现1045错误的解决方式
2020/05/14 Python
学校安全检查制度
2014/01/27 职场文书
元旦促销方案
2014/03/15 职场文书
小学见习报告
2014/10/31 职场文书
后备干部推荐材料
2014/12/24 职场文书
学术会议领导致辞
2015/07/29 职场文书
中国现代文学之经典散文三篇
2019/09/18 职场文书
教你如何使用Python下载B站视频的详细教程
2021/04/29 Python
linux中nohup和后台运行进程查看及终止
2021/06/24 Python
Sql Server之数据类型详解
2022/02/28 SQL Server
vue-cli3.x配置全局的scss的时候报错问题及解决
2022/04/30 Vue.js