用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 相关文章推荐
jQuery EasyUI API 中文文档 - DateBox日期框
Oct 15 PHP
php文件怎么打开 如何执行php文件
Dec 21 PHP
PHP写UltraEdit插件脚本实现方法
Dec 26 PHP
浅析PHP的静态成员函数效率更高的原因
Jun 13 PHP
图解找出PHP配置文件php.ini的路径的方法
Aug 20 PHP
jquery+php+ajax显示上传进度的多图片上传并生成缩略图代码
Oct 15 PHP
你应该知道PHP浮点数知识
May 13 PHP
PHP+MySQL之Insert Into数据插入用法分析
Sep 27 PHP
Yii中Model(模型)的创建及使用方法
Dec 28 PHP
降低PHP Redis内存占用
Mar 23 PHP
php 多个变量指向同一个引用($b = &amp;$a)用法分析
Nov 13 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
Mar 24 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 fsockopen写的HTTP下载的类
2007/02/22 PHP
php 采集书并合成txt格式的实现代码
2009/03/01 PHP
PHP 一个页面执行时间类代码
2010/03/05 PHP
PHP使用GIFEncoder类生成的GIF动态图片验证码
2014/07/01 PHP
PHP通过API获取手机号码归属地
2015/05/28 PHP
yii去掉必填项中星号的方法
2015/12/28 PHP
Yii2创建表单(ActiveForm)方法详解
2016/07/23 PHP
两种常用的javascript数组去重方法思路及代码
2013/03/26 Javascript
原生javaScript做得动态表格(注释写的很清楚)
2013/12/29 Javascript
jQuery使用$.ajax进行即时验证的方法
2015/12/08 Javascript
jQuery遍历DOM的父级元素、子级元素和同级元素的方法总结
2016/07/07 Javascript
浅谈AngularJS中ng-class的使用方法
2016/11/11 Javascript
关于vuex的学习实践笔记
2017/04/05 Javascript
JavaScript寄生组合式继承原理与用法分析
2019/01/11 Javascript
mpvue+vant app搭建微信小程序的方法步骤
2019/02/11 Javascript
WebSocket的简单介绍及应用
2019/05/23 Javascript
TypeScript中使用getElementXXX()的示例代码
2019/09/12 Javascript
javascript sort()对数组中的元素进行排序详解
2019/10/13 Javascript
JavaScript字符串处理常见操作方法小结
2019/11/15 Javascript
Python fileinput模块使用实例
2015/05/28 Python
对pandas中Series的map函数详解
2018/07/25 Python
python 通过麦克风录音 生成wav文件的方法
2019/01/09 Python
python实现视频分帧效果
2019/05/31 Python
python aiohttp的使用详解
2019/06/20 Python
Python通过Manager方式实现多个无关联进程共享数据的实现
2019/11/07 Python
TensorFlow tensor的拼接实例
2020/01/19 Python
TensorFLow 变量命名空间实例
2020/02/11 Python
Python破解BiliBili滑块验证码的思路详解(完美避开人机识别)
2020/02/17 Python
美国瑜伽品牌:Gaiam
2017/10/31 全球购物
广州地球村科技数据库题目
2016/04/25 面试题
企业为何需要商业计划书
2013/12/26 职场文书
多媒体专业自我鉴定
2014/02/28 职场文书
员工工作表现评语
2014/04/26 职场文书
新教师教学工作总结
2015/08/12 职场文书
Python中使用tkFileDialog实现文件选择、保存和路径选择
2022/05/20 Python
react中useState使用:如何实现在当前表格直接更改数据
2022/08/05 Javascript