用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
MySql 按时间段查询数据方法(实例说明)
Nov 02 PHP
php生成局部唯一识别码LUID的代码
Oct 06 PHP
提高PHP编程效率的方法
Nov 07 PHP
php中的curl使用入门教程和常见用法实例
Apr 10 PHP
PHP格式化MYSQL返回float类型的方法
Mar 30 PHP
Thinkphp3.2.3整合phpqrcode生成带logo的二维码
Jul 21 PHP
thinkphp3.2.3 分页代码分享
Jul 28 PHP
php UNIX时间戳用法详解
Feb 16 PHP
PHP实现的折半查找算法示例
Dec 19 PHP
Laravel5.4框架使用socialite实现github登录的方法
Mar 20 PHP
php7 新增功能实例总结
May 25 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
也谈截取首页新闻 - 范例
2006/10/09 PHP
php过滤html标记属性类用法实例
2014/09/23 PHP
CI框架入门示例之数据库取数据完整实现方法
2014/11/05 PHP
thinkphp5 migrate数据库迁移工具
2018/02/20 PHP
如何阻止复制剪切和粘贴事件为了表单内容的安全
2013/05/23 Javascript
jquery动态添加option示例
2013/12/30 Javascript
jQuery内部原理和实现方式浅析
2015/02/03 Javascript
11种ASP连接数据库的方法
2015/09/18 Javascript
JS+DIV+CSS排版布局实现美观的选项卡效果
2015/10/10 Javascript
jQuery页面刷新(局部、全部)问题分析
2016/01/09 Javascript
原生JS封装ajax 传json,str,excel文件上传提交表单(推荐)
2016/06/21 Javascript
JavaScript省市区三级联动菜单效果
2016/09/21 Javascript
基于JavaScript实现瀑布流效果
2017/03/29 Javascript
nodejs个人博客开发第六步 数据分页
2017/04/12 NodeJs
关于HTML5的data-*自定义属性的总结
2018/05/05 Javascript
React路由鉴权的实现方法
2019/09/05 Javascript
微信js-sdk 录音功能的示例代码
2019/11/01 Javascript
Python实现曲线点抽稀算法的示例
2017/10/12 Python
Python WXPY实现微信监控报警功能的代码
2017/10/20 Python
python定向爬取淘宝商品价格
2018/02/27 Python
python GUI编程(Tkinter) 创建子窗口及在窗口上用图片绘图实例
2020/03/04 Python
Python 如何对文件目录操作
2020/07/10 Python
Python3爬虫mitmproxy的安装步骤
2020/07/29 Python
Python爬虫获取豆瓣电影并写入excel
2020/07/31 Python
通过python-pptx模块操作ppt文件的方法
2020/12/26 Python
JD Sports澳洲官网:英国领先的运动鞋和运动时尚零售商
2020/02/15 全球购物
写出SQL四条最基本的数据操作语句(DML)
2012/12/12 面试题
建筑文秘专业个人求职信范文
2013/12/28 职场文书
项目开发计划书
2014/01/09 职场文书
十佳中学生事迹材料
2014/06/02 职场文书
小学教师2014年度工作总结
2014/12/03 职场文书
金秋助学感谢信
2015/01/21 职场文书
莫言诺贝尔获奖感言(全文)
2015/07/31 职场文书
辅导员学期工作总结
2015/08/14 职场文书
2016大学生毕业实习心得体会
2016/01/23 职场文书
讨论nginx location 顺序问题
2022/05/30 Servers