用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同时支持GIF、png、JPEG
Oct 09 PHP
傻瓜化配置PHP环境――Appserv
Dec 13 PHP
php 代码优化之经典示例
Mar 24 PHP
判断php数组是否为索引数组的实现方法
Jun 13 PHP
php实现mysql事务处理的方法
Dec 25 PHP
JavaScript与HTML结合的基本使用方法整理
Oct 12 PHP
PHP7之Mongodb API使用详解
Dec 26 PHP
PHP的Yii框架中行为的定义与绑定方法讲解
Mar 18 PHP
php cli模式下获取参数的方法
May 05 PHP
PHP实现时间比较和时间差计算的方法示例
Jul 24 PHP
PHP实现二维数组按照指定的字段进行排序算法示例
Apr 23 PHP
Laravel框架控制器的middleware中间件用法分析
Sep 30 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
ThinkPHP登录功能的实现方法
2014/08/20 PHP
php实现处理输入转义字符的代码
2015/11/08 PHP
PHP单例模式简单用法示例
2017/06/23 PHP
Laravel重定向,a链接跳转,控制器跳转示例
2019/10/22 PHP
获取Javscript执行函数名称的方法
2006/12/22 Javascript
javascript 有用的脚本函数
2009/05/07 Javascript
JS俄罗斯方块,包含完整的设计理念
2010/12/11 Javascript
JSON无限折叠菜单编写实例
2013/12/16 Javascript
JS实现距离上次刷新已过多少秒示例
2014/05/23 Javascript
从JQuery源码分析JavaScript函数的apply方法与call方法
2014/09/25 Javascript
Flash图片上传组件 swfupload使用指南
2015/03/14 Javascript
jQuery绑定自定义事件的魔法升级版
2016/06/30 Javascript
BootStrap的select2既可以查询又可以输入的实现代码
2017/02/17 Javascript
Java中int与integer的区别(基本数据类型与引用数据类型)
2017/02/19 Javascript
详解Angular 开发环境搭建
2017/06/22 Javascript
Angularjs过滤器实现动态搜索与排序功能示例
2017/12/13 Javascript
浅谈React组件之性能优化
2018/03/02 Javascript
JS实现求字符串中出现最多次数的字符和次数示例
2019/07/05 Javascript
vue实现倒计时获取验证码效果
2020/04/17 Javascript
js canvas实现星空连线背景特效
2019/11/01 Javascript
[02:52]2014DOTA2西雅图国际邀请赛 CIS战队巡礼
2014/07/07 DOTA
Python StringIO模块实现在内存缓冲区中读写数据
2015/04/08 Python
python实现将汉字转换成汉语拼音的库
2015/05/05 Python
Nginx搭建HTTPS服务器和强制使用HTTPS访问的方法
2015/08/16 Python
python使用pymysql实现操作mysql
2016/09/13 Python
Python使用Opencv实现图像特征检测与匹配的方法
2019/10/30 Python
idea2020手动安装python插件的实现方法
2020/07/17 Python
python中str内置函数用法总结
2020/12/27 Python
详解基于Facecognition+Opencv快速搭建人脸识别及跟踪应用
2021/01/21 Python
HTML5实现移动端弹幕动画效果
2019/08/01 HTML / CSS
H5页面适配iPhoneX(就是那么简单)
2019/12/02 HTML / CSS
STAUD官方网站:洛杉矶独有的闲适风格
2019/04/11 全球购物
全球最大化妆品零售网站:SkinStore
2020/10/24 全球购物
Vrbo西班牙:预订您的度假公寓(公寓、乡村房屋…)
2020/04/27 全球购物
工厂实习感言
2014/01/14 职场文书
2015年仓管员工作总结
2015/04/21 职场文书