用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+mysql)
Nov 23 PHP
php mysql_real_escape_string函数用法与实例教程
Sep 30 PHP
php5.2以下版本无json_decode函数的解决方法
May 25 PHP
windows7下安装php的php-ssh2扩展教程
Jul 04 PHP
Yii实现多按钮保存与提交的方法
Dec 03 PHP
windows下配置php5.5开发环境及开发扩展
Dec 25 PHP
Yii控制器中操作视图js的方法
Jul 04 PHP
php中preg_replace_callback函数简单用法示例
Jul 21 PHP
PHP中list方法用法示例
Dec 01 PHP
php实现文件管理与基础功能操作
Mar 21 PHP
CMSPRESS 10行代码搞定 PHP无限级分类2
Mar 30 PHP
php字符串截取函数mb_substr用法实例分析
Jun 25 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
重料打造自己的“宝马”---第三代
2021/03/02 无线电
DedeCms模板安装/制作概述
2007/03/11 PHP
laravel 解决crontab不执行的问题
2019/10/22 PHP
FF IE兼容性的修改小结
2009/09/02 Javascript
判断iframe是否加载完成的完美方法
2010/01/07 Javascript
$.ajax返回的JSON无法执行success的解决方法
2011/09/09 Javascript
node.js中的console.timeEnd方法使用说明
2014/12/09 Javascript
JavaScript中使用Callback控制流程介绍
2015/03/16 Javascript
基于JavaScript实现Json数据根据某个字段进行排序
2015/11/24 Javascript
学习使用bootstrap基本控件(table、form、button)
2016/04/12 Javascript
什么是JavaScript中的结果值?
2016/10/08 Javascript
简单理解js的prototype属性及使用
2016/12/07 Javascript
javascript图片预览和上传(兼容IE)
2017/03/15 Javascript
JavaScript原型继承_动力节点Java学院整理
2017/06/30 Javascript
详解angular笔记路由之angular-router
2017/09/12 Javascript
axios post提交formdata的实例
2018/03/16 Javascript
python list中append()与extend()用法分享
2013/03/24 Python
搭建Python的Django框架环境并建立和运行第一个App的教程
2016/07/02 Python
Python基础学习之基本数据结构详解【数字、字符串、列表、元组、集合、字典】
2019/06/18 Python
python3的url编码和解码,自定义gbk、utf-8的例子
2019/08/22 Python
Python如何基于rsa模块实现非对称加密与解密
2020/01/03 Python
简单了解Java Netty Reactor三种线程模型
2020/04/26 Python
windows+vscode安装paddleOCR运行环境的步骤
2020/11/11 Python
国外最大的眼镜网站:Coastal
2017/08/09 全球购物
Clarria化妆品官方网站:购买天然和有机化妆品系列
2018/04/08 全球购物
Pretty You London官网:英国拖鞋和睡衣品牌
2019/05/08 全球购物
linux面试题参考答案(1)
2016/01/22 面试题
计算机求职信
2013/12/01 职场文书
中西医专业毕业生职业规划书
2014/02/24 职场文书
经营理念口号
2014/06/21 职场文书
2015年公务员工作总结
2015/04/24 职场文书
2015年车间安全管理工作总结
2015/05/13 职场文书
红高粱观后感
2015/06/10 职场文书
公司人力资源管理制度
2015/08/05 职场文书
Html分层的box-shadow效果的示例代码
2021/03/30 HTML / CSS
基于Redis过期事件实现订单超时取消
2021/05/08 Redis