用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 相关文章推荐
MayFish PHP的MVC架构的开发框架
Aug 13 PHP
php的chr和ord函数实现字符加减乘除运算实现代码
Dec 05 PHP
thinkphp获取栏目和文章当前位置的方法
Oct 29 PHP
php将日期格式转换成xx天前的格式
Apr 16 PHP
PHP实现抓取迅雷VIP账号的方法
Jul 30 PHP
PHP浮点数的一个常见问题
Mar 10 PHP
Symfony实现行为和模板中取得request参数的方法
Mar 17 PHP
php同时使用session和cookie来保存用户登录信息的实现代码
May 13 PHP
PHP模拟http请求的方法详解
Nov 09 PHP
apache集成php7.3.5的详细步骤
Jun 20 PHP
PHP defined()函数的使用图文详解
Jul 20 PHP
PHP获取当前时间不准确问题解决方案
Aug 14 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
?生?D片??C字串
2006/12/06 PHP
浅析php插件 HTMLPurifier HTML解析器
2013/07/01 PHP
ThinkPHP的模版中调用session数据的方法
2014/07/01 PHP
php递归json类实例
2014/12/02 PHP
php版微信公众平台接口开发之智能回复开发教程
2016/09/22 PHP
PHP实现可添加水印与生成缩略图的图片处理工具类
2018/01/16 PHP
浅析PHP中的 inet_pton 网络函数
2019/12/16 PHP
基于jQuery实现的当离开页面时出现提示的实现代码
2011/06/27 Javascript
jQuery中Form相关知识汇总
2015/01/06 Javascript
JS实现跟随鼠标立体翻转图片的方法
2015/05/04 Javascript
JavaScript类型系统之Object详解
2016/01/07 Javascript
JS锚点的设置与使用方法
2016/09/05 Javascript
javascript汉字拼音互转的简单实例
2016/10/09 Javascript
第一次接触神奇的前端框架vue.js
2016/12/01 Javascript
vue双向绑定的简单实现
2016/12/22 Javascript
基于JavaScript实现的顺序查找算法示例
2017/04/14 Javascript
在vue中添加Echarts图表的基本使用教程
2017/11/22 Javascript
Node.js使用Angular简单示例
2018/05/11 Javascript
浅谈Angular7 项目开发总结
2018/12/19 Javascript
浅谈Javascript常用正则表达式应用
2019/03/08 Javascript
vue学习笔记之作用域插槽实例分析
2020/02/01 Javascript
原生js实现拖拽移动与缩放效果
2020/08/24 Javascript
HTML元素拖拽功能实现的完整实例
2020/12/04 Javascript
深入理解python对json的操作总结
2017/01/05 Python
Python操作Sql Server 2008数据库的方法详解
2018/05/17 Python
Python登录系统界面实现详解
2019/06/25 Python
浅析python 字典嵌套
2020/09/29 Python
沙特阿拉伯家用电器和电子产品购物网站:Sheta and Saif
2020/04/03 全球购物
园艺师求职信
2014/03/10 职场文书
2015年检验员工作总结范文
2015/04/30 职场文书
同意报考证明
2015/06/17 职场文书
开业典礼致辞
2015/07/29 职场文书
靠谱准确的求职信
2019/04/02 职场文书
人生一定要学会的三样东西:放下、忘记、珍惜
2019/08/21 职场文书
七年级作文(600字3篇)
2019/09/24 职场文书
Golang 空map和未初始化map的注意事项说明
2021/04/29 Golang