用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树的代码,可以嵌套任意层
Oct 09 PHP
在PHP中使用Sockets 从Usenet中获取文件
Jan 10 PHP
java EJB 加密与解密原理的一个例子
Jan 11 PHP
使用XDebug调试及单元测试覆盖率分析
Jan 27 PHP
Fedora下安装php Redis扩展笔记
Sep 03 PHP
php自定义分页类完整实例
Dec 25 PHP
PHP7匿名类用法分析
Sep 26 PHP
thinkphp整合微信支付代码分享
Nov 24 PHP
使用Codeigniter重写insert的方法(推荐)
Mar 23 PHP
PHP扩展Swoole实现实时异步任务队列示例
Apr 13 PHP
ThinkPHP5&amp;5.1实现验证码的生成、使用及点击刷新功能示例
Feb 07 PHP
Laravel框架源码解析之反射的使用详解
May 14 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
模拟SQLSERVER的两个函数:dateadd(),datediff()
2006/10/09 PHP
PHP中使用Imagick读取pdf并生成png缩略图实例
2015/01/21 PHP
jquery全选/全不选/反选另一种实现方法(配合原生js)
2013/04/07 Javascript
主页面中的两个iframe实现鼠标拖动改变其大小
2013/04/16 Javascript
jquery提交form表单时禁止重复提交的方法
2014/02/13 Javascript
jquery 新建的元素事件绑定问题解决方案
2014/06/12 Javascript
jquery、js调用iframe父窗口与子窗口元素的方法整理
2014/07/31 Javascript
checkbox选中与未选中判断示例
2014/08/04 Javascript
JQ技术实现注册页面带有校验密码强度
2015/07/27 Javascript
详解js中构造流程图的核心技术JsPlumb
2015/12/08 Javascript
详解JavaScript实现设计模式中的适配器模式的方法
2016/05/18 Javascript
JavaScript:Array类型全面解析
2016/05/19 Javascript
全面了解js中的script标签
2016/07/04 Javascript
JavaScript实战之菜单特效
2016/08/16 Javascript
原生JavaScript实现的简单省市县三级联动功能示例
2017/05/27 Javascript
利用types增强vscode中js代码提示功能详解
2017/07/07 Javascript
Bootstrap Multiselect 常用组件实现代码
2017/07/09 Javascript
React Native 集成jpush-react-native的示例代码
2017/08/16 Javascript
元素全屏的设置与监听实例
2017/11/28 Javascript
解决在vue项目中,发版之后,背景图片报错,路径不对的问题
2018/03/06 Javascript
javascript+css实现进度条效果
2020/03/25 Javascript
浅谈vue 二级路由嵌套和二级路由高亮问题
2020/08/06 Javascript
python发送邮件的实例代码(支持html、图片、附件)
2013/03/04 Python
python with statement 进行文件操作指南
2014/08/22 Python
python中dir函数用法分析
2015/04/17 Python
Python实现二维有序数组查找的方法
2016/04/27 Python
python自动化实现登录获取图片验证码功能
2019/11/20 Python
Python pickle模块实现对象序列化
2019/11/22 Python
Python 限定函数参数的类型及默认值方式
2019/12/24 Python
Python面向对象特殊属性及方法解析
2020/09/16 Python
pycharm使用技巧之自动调整代码格式总结
2020/11/04 Python
美国在线家居装饰店:Belle&June
2018/10/24 全球购物
班组长安全职责
2014/01/05 职场文书
大学生自荐信范文
2015/03/05 职场文书
毕业论文致谢部分怎么写
2015/05/14 职场文书
2016年春季趣味运动会开幕词
2016/03/04 职场文书