用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 相关文章推荐
将文件夹压缩成zip文件的php代码
Dec 14 PHP
php学习笔记 面向对象中[接口]与[多态性]的应用
Jun 16 PHP
PHP用SAX解析XML的实现代码与问题分析
Aug 22 PHP
深入PHP变量存储的详解
Jun 13 PHP
PHP将回调函数作用到给定数组单元的方法
Aug 19 PHP
php防止站外远程提交表单的方法
Oct 20 PHP
关于PHP定时发送服务的解决办法
Apr 23 PHP
PHP长连接实现与使用方法详解
Feb 11 PHP
Laravel框架模板加载,分配变量及简单路由功能示例
Jun 11 PHP
PHP封装的验证码工具类定义与用法示例
Aug 22 PHP
Windows平台PHP+IECapt实现网页批量截图并创建缩略图功能详解
Aug 02 PHP
YII2框架中behavior行为的理解与使用方法示例
Mar 13 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连接mysql数据库代码
2009/03/10 PHP
php读取二进制流(C语言结构体struct数据文件)的深入解析
2013/06/13 PHP
php下Memcached入门实例解析
2015/01/05 PHP
php中有关合并某一字段键值相同的数组合并的改进
2015/03/10 PHP
如何通过View::first使用Laravel Blade的动态模板详解
2017/09/21 PHP
PHP使用PDO 连接与连接管理操作实例分析
2020/04/21 PHP
基于jquery实现的可以编辑选择的下拉框的代码
2010/11/19 Javascript
分享一个自己写的table表格排序js插件(高效简洁)
2011/10/29 Javascript
JavaScript NaN和Infinity特殊值 [译]
2012/09/20 Javascript
jQuery+css实现图片滚动效果(附源码)
2013/03/18 Javascript
jQery使网页在显示器上居中显示适用于任何分辨率
2014/06/09 Javascript
java和javascript获取word文档的书签位置对比
2014/06/19 Javascript
javascript基于DOM实现权限选择实例分析
2015/05/14 Javascript
JSONObject使用方法详解
2015/12/17 Javascript
JQuery 两种方法解决刚创建的元素遍历不到的问题
2016/04/13 Javascript
全国省市二级联动下拉菜单 js版
2016/05/10 Javascript
浅谈javascript中的三种弹窗
2016/10/21 Javascript
Node.js用readline模块实现输入输出
2016/12/16 Javascript
原生js实现秒表计时器功能
2017/02/16 Javascript
微信小程序 request接口的封装实例代码
2017/04/26 Javascript
Bootstrap modal只加载一次数据的解决办法(推荐)
2017/11/24 Javascript
JavaScript解析JSON数据示例
2019/07/16 Javascript
解决vant title-active-color与title-inactive-color不生效问题
2020/11/03 Javascript
Python3.x中自定义比较函数
2015/04/24 Python
python实现RSA加密(解密)算法
2016/02/17 Python
微信 用脚本查看是否被微信好友删除
2016/10/28 Python
在PyCharm中三步完成PyPy解释器的配置的方法
2018/10/29 Python
docker django无法访问redis容器的解决方法
2019/08/21 Python
利用python实现AR教程
2019/11/20 Python
详解三种方式实现平滑滚动页面到顶部的功能
2019/04/23 HTML / CSS
英国最大的奢侈品零售网络商城:Flannels
2016/09/16 全球购物
蹦床仓库:Trampoline Warehouse
2018/12/06 全球购物
以思科路由器为例你写下单臂路由的配置命令
2013/08/03 面试题
社区安全检查制度
2014/02/03 职场文书
Python合并pdf文件的工具
2021/07/01 Python
Python中Selenium对Cookie的操作方法
2021/07/09 Python