用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 相关文章推荐
安装APACHE
Jan 15 PHP
Android ProgressBar进度条和ProgressDialog进度框的展示DEMO
Jun 19 PHP
PHP中include与require使用方法区别详解
Oct 19 PHP
使用php清除bom示例
Mar 03 PHP
推荐25款php中非常有用的类库
Sep 29 PHP
php中base64_decode与base64_encode加密解密函数实例
Nov 24 PHP
PHP实现多关键字加亮功能
Oct 21 PHP
完美解决php 导出excle的.csv格式的数据时乱码问题
Feb 18 PHP
PHP实现对xml的增删改查操作案例分析
May 19 PHP
PHP实现会员账号单唯一登录的方法分析
Mar 07 PHP
PHP实现无限极分类的两种方式示例【递归和引用方式】
Mar 25 PHP
php下的原生ajax请求用法实例分析
Feb 28 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 表单提交给自己
2008/07/24 PHP
php 智能404跳转代码,适合换域名没改变目录的网站
2010/06/04 PHP
PHP获取文件夹大小函数用法实例
2015/07/01 PHP
PHP实现简单注册登录系统
2020/12/28 PHP
JavaScript 对象成员的可见性说明
2009/10/16 Javascript
input 和 textarea 输入框最大文字限制的jquery插件
2011/10/27 Javascript
JavaScript 用cloneNode方法克隆节点的代码
2012/10/15 Javascript
js 获取、清空input type=&quot;file&quot;的值(示例代码)
2013/12/24 Javascript
Bootstrap网格系统详解
2016/04/26 Javascript
简单谈谈ES6的六个小特性
2016/11/18 Javascript
微信小程序 支付后台java实现实例
2017/05/09 Javascript
微信小程序实现打开内置地图功能【附源码下载】
2017/12/07 Javascript
vue弹窗插件实战代码
2018/09/08 Javascript
深度了解vue.js中hooks的相关知识
2019/06/14 Javascript
layui异步加载table表中某一列数据的例子
2019/09/16 Javascript
微信小程序实现3D轮播图效果(非swiper组件)
2019/09/21 Javascript
JS实现横向轮播图(初级版)
2020/06/24 Javascript
vue-以文件流-blob-的形式-下载-导出文件操作
2020/08/07 Javascript
JS面向对象实现飞机大战
2020/08/26 Javascript
js将日期格式转换为YYYY-MM-DD HH:MM:SS
2020/09/18 Javascript
Python subprocess模块学习总结
2014/03/13 Python
Python中类的定义、继承及使用对象实例详解
2015/04/30 Python
Python函数中*args和**kwargs来传递变长参数的用法
2016/01/26 Python
python中函数默认值使用注意点详解
2016/06/01 Python
Python教程之全局变量用法
2016/06/27 Python
python使用selenium登录QQ邮箱(附带滑动解锁)
2019/01/23 Python
python实战串口助手_解决8串口多个发送的问题
2019/06/12 Python
详解CSS透明opacity和IE各版本透明度滤镜filter的最准确用法
2016/12/20 HTML / CSS
上海雨人软件技术开发有限公司测试题
2015/07/14 面试题
人事主管的岗位职责
2013/11/16 职场文书
业务员岗位职责范本
2013/12/15 职场文书
《小儿垂钓》教学反思
2014/02/23 职场文书
2014年民政工作总结
2014/11/26 职场文书
2015年元旦文艺晚会总结(学院)
2014/11/28 职场文书
2015年招生工作总结
2015/05/04 职场文书
Python OpenCV超详细讲解基本功能
2022/04/02 Python