用PHP函数解决SQL injection


Posted in PHP onOctober 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;
}
?>

 

PHP 相关文章推荐
php自动适应范围的分页代码
Aug 05 PHP
PHP 操作文件的一些FAQ总结
Feb 12 PHP
php array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
Jul 12 PHP
使用php检测用户当前使用的浏览器是否为IE浏览器
Dec 03 PHP
php操作xml入门之xml标签的属性分析
Jan 23 PHP
php自动更新版权信息显示的方法
Jun 19 PHP
学习php设计模式 php实现享元模式(flyweight)
Dec 07 PHP
PHP三种方式实现链式操作详解
Jan 21 PHP
php 数组元素快速去重
May 05 PHP
PHP封装的分页类与简单用法示例
Feb 25 PHP
php策略模式简单示例分析【区别于工厂模式】
Sep 25 PHP
PHP上传图片到数据库并显示的实例代码
Dec 20 PHP
session 的生命周期是多长
Oct 09 #PHP
做个自己站内搜索引擎
Oct 09 #PHP
用libTemplate实现静态网页的生成
Oct 09 #PHP
php注入实例
Oct 09 #PHP
967 个函式
Oct 09 #PHP
如何给phpadmin一个保护
Oct 09 #PHP
Search Engine Friendly的URL设计
Oct 09 #PHP
You might like
PHP中Date获取时间不正确怎么办
2008/06/05 PHP
php过滤html中的其他网站链接的方法(域名白名单功能)
2014/04/24 PHP
ThinkPHP之A方法实例讲解
2014/06/20 PHP
PHP流Streams、包装器wrapper概念与用法实例详解
2017/11/17 PHP
use jscript with List Proxy Server Information
2007/06/11 Javascript
JS加jquery简单实现标签元素的显示或隐藏
2013/09/23 Javascript
js模拟点击以提交表单为例兼容主流浏览器
2013/11/29 Javascript
在Mac OS下使用Node.js的简单教程
2015/06/24 Javascript
DeviceOne 让你一见钟情的App快速开发平台
2016/02/17 Javascript
Bootstrap每天必学之弹出框(Popover)插件
2016/04/25 Javascript
Jquery给当前页或者跳转后页面的导航栏添加选中后样式的实例
2016/12/08 Javascript
JS实现太极旋转思路分析
2016/12/09 Javascript
Js自动截取字符串长度,添加省略号(……)的实现方法
2017/03/06 Javascript
全面解析vue中的数据双向绑定
2017/05/10 Javascript
vue.js 嵌套循环、if判断、动态删除的实例
2018/03/07 Javascript
详解swipe使用及竖屏页面滚动方法
2018/06/28 Javascript
如何使用CSS3+JQuery实现悬浮墙式菜单
2019/06/18 jQuery
layui table动态表头 改变表格头部 重新加载表格的方法
2019/09/21 Javascript
JS面向对象编程实现的Tab选项卡案例详解
2020/03/03 Javascript
JQuery实现折叠式菜单的详细代码
2020/06/03 jQuery
node.js通过url读取文件
2020/10/16 Javascript
使用Python的Tornado框架实现一个简单的WebQQ机器人
2015/04/24 Python
python实现批量图片格式转换
2020/06/16 Python
讲解Python3中NumPy数组寻找特定元素下标的两种方法
2019/08/04 Python
python sitk.show()与imageJ结合使用常见的问题
2020/04/20 Python
python与c语言的语法有哪些不一样的
2020/09/13 Python
函授自我鉴定
2013/11/06 职场文书
大学生党课思想汇报
2013/12/29 职场文书
军训自我鉴定范文
2014/02/13 职场文书
招聘专员岗位职责
2014/03/07 职场文书
服务承诺书范文
2014/05/19 职场文书
关于教师节的广播稿
2014/09/10 职场文书
2014年党的群众路线整改措施思想汇报
2014/10/12 职场文书
药品销售员2015年终工作总结
2015/10/22 职场文书
公司年会主持词范文!
2019/05/07 职场文书
springboot应用服务启动事件的监听实现
2022/04/06 Java/Android