用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的ajax框架xajax入门与试用介绍
Dec 19 PHP
smarty巧妙处理iframe中内容页的代码
Mar 07 PHP
php 中的4种标记风格介绍
May 10 PHP
php中使用preg_replace函数匹配图片并加上链接的方法
Feb 06 PHP
如何使用php判断所处服务器操作系统的类型
Jun 20 PHP
ThinkPHP实现将本地文件打包成zip下载
Jun 26 PHP
ThinkPHP中url隐藏入口文件后接收alipay传值的方法
Dec 09 PHP
jQuery向下滚动即时加载内容实现的瀑布流效果
Jan 07 PHP
PHP页面跳转实现延时跳转的方法
Dec 10 PHP
thinkPHP数据查询常用方法总结【select,find,getField,query】
Mar 15 PHP
PHP实现文件下载【实例分享】
Apr 28 PHP
php和vue配合使用技巧和方法
May 09 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 CURL获取邮箱地址的详解
2013/06/03 PHP
解析php中用PHPMailer来发送邮件的示例(126.com的例子)
2013/06/24 PHP
IIS安装Apache伪静态插件的具体操作图文
2013/07/01 PHP
php中array_column函数简单实现方法
2016/07/11 PHP
动态改变textbox的宽高的js
2006/10/26 Javascript
IE与firefox下Dhtml的一些区别小结
2009/12/02 Javascript
jqPlot 基于jquery的画图插件
2011/04/26 Javascript
当前流行的JavaScript代码风格指南
2014/09/10 Javascript
JavaScript中的6种运算符总结
2014/10/16 Javascript
jquery中filter方法用法实例分析
2015/02/06 Javascript
JQuery中$.each 和$(selector).each()的区别详解
2015/03/13 Javascript
JQuery 两种方法解决刚创建的元素遍历不到的问题
2016/04/13 Javascript
微信小程序实战之自定义抽屉菜单(7)
2017/04/18 Javascript
nodejs模块学习之connect解析
2017/07/05 NodeJs
js精确的加减乘除实例
2017/11/14 Javascript
layui--js控制switch的切换方法
2019/09/03 Javascript
JS页面获取 session 值,作用域和闭包学习笔记
2019/10/16 Javascript
js实现查询商品案例
2020/07/22 Javascript
对vuex中store和$store的区别说明
2020/07/24 Javascript
Python实现单词翻译功能
2017/06/06 Python
对Python的多进程锁的使用方法详解
2019/02/18 Python
对Matlab中共轭、转置和共轭装置的区别说明
2020/05/11 Python
python中Ansible模块的Playbook的具体使用
2020/05/28 Python
python通过函数名调用函数的几种场景
2020/09/23 Python
Python生成pdf目录书签的实例方法
2020/10/29 Python
HTML5拖拉上传文件的简单实例
2017/01/11 HTML / CSS
JD Sports瑞典:英国领先的运动时尚商店
2018/01/28 全球购物
俄罗斯鲜花递送:AMF
2020/04/24 全球购物
自动化专业个人求职信范文
2013/12/30 职场文书
一年级家长会邀请函
2014/01/25 职场文书
优秀信贷员先进事迹
2014/01/31 职场文书
《我的伯父鲁迅先生》教学反思
2014/02/12 职场文书
春节晚会开场白
2015/05/29 职场文书
集结号观后感
2015/06/08 职场文书
分享几个实用的CSS代码块
2022/06/10 HTML / CSS
使用CSS实现音波加载效果
2023/05/07 HTML / CSS