用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中的观察者模式
Mar 24 PHP
phpize的深入理解
Jun 03 PHP
解析PHP生成静态html文件的三种方法
Jun 18 PHP
ThinkPHP的I方法使用详解
Jun 18 PHP
php通过curl添加cookie伪造登陆抓取数据的方法
Apr 02 PHP
Thinkphp自定义代码生成工具及用法说明(附下载地址)
May 27 PHP
PHP实现适用于文件内容操作的分页类
Jun 15 PHP
php数组实现根据某个键值将相同键值合并生成新二维数组的方法
Apr 26 PHP
PHP实现生成模糊图片的方法示例
Dec 21 PHP
PHP中PDO事务处理操作示例
May 02 PHP
thinkPHP5框架实现基于ajax的分页功能示例
Jun 12 PHP
Laravel等框架模型关联的可用性浅析
Dec 15 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下关于中英数字混排的字符串分割问题
2010/04/06 PHP
PHP中改变图片的尺寸大小的代码
2011/07/17 PHP
编译PHP报错configure error Cannot find libmysqlclient under usr的解决方法
2014/06/27 PHP
php+ajax实现无刷新的新闻留言系统
2020/12/21 PHP
ThinkPHP实现更新数据实例详解(demo)
2016/06/29 PHP
PHP中SERIALIZE和JSON的序列化与反序列化操作区别分析
2016/10/11 PHP
thinkphp实现附件上传功能
2017/05/26 PHP
js资料prototype 属性
2007/03/13 Javascript
jQuery 源码分析笔记(4) Ready函数
2011/06/02 Javascript
关于JavaScript对象的动态选择及遍历对象
2014/03/10 Javascript
使用phantomjs进行网页抓取的实现代码
2014/09/29 Javascript
js实现遍历含有input的table实例
2015/12/07 Javascript
JavaScript面向对象程序设计教程
2016/03/29 Javascript
jquery.cookie.js实现用户登录保存密码功能的方法
2016/04/15 Javascript
js阻止浏览器默认行为的简单实例
2016/05/15 Javascript
jQuery实现动态给table赋值的方法示例
2017/07/04 jQuery
JS实现简单的抽奖转盘效果示例
2019/02/16 Javascript
jQuery内容选择器与表单选择器实例分析
2019/06/28 jQuery
Vue实现验证码功能
2019/12/03 Javascript
JS简单表单验证功能完整示例
2020/01/26 Javascript
创建与框架无关的JavaScript插件
2020/12/01 Javascript
[54:10]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
解析Python中while true的使用
2015/10/13 Python
Python自定义简单图轴简单实例
2018/01/08 Python
python从子线程中获得返回值的方法
2019/01/30 Python
python的几种矩阵相乘的公式详解
2019/07/10 Python
ansible动态Inventory主机清单配置遇到的坑
2020/01/19 Python
使用PyQt的QLabel组件实现选定目标框功能的方法示例
2020/05/19 Python
利用Python实现字幕挂载(把字幕文件与视频合并)思路详解
2020/10/21 Python
HTML5 Web Workers之网站也能多线程的实现
2013/04/24 HTML / CSS
BLACKMORES澳洲官网:澳大利亚排名第一的保健品牌
2018/09/27 全球购物
职场:企业印章管理制度(模板)
2019/10/18 职场文书
golang gopm get -g -v 无法获取第三方库的解决方案
2021/05/05 Golang
解析Java异步之call future
2021/06/14 Java/Android
Golang的继承模拟实例
2021/06/30 Golang
HTML中实现音乐或视频自动播放案例详解
2022/05/30 HTML / CSS