用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与XML联手进行网站编程代码实例
Jul 10 PHP
PHP 获取远程网页内容的代码(fopen,curl已测)
Jun 06 PHP
一个典型的PHP分页实例代码分享
Jul 28 PHP
php 深入理解strtotime函数的使用详解
May 23 PHP
PHP生成图片验证码、点击切换实例
Jun 25 PHP
php短网址和数字之间相互转换的方法
Mar 13 PHP
PHP常用处理静态操作类
Apr 03 PHP
PHP实现的oracle分页函数实例
Jan 25 PHP
symfony2.4的twig中date用法分析
Mar 18 PHP
CI框架无限级分类+递归的实现代码
Nov 01 PHP
ThinkPHP中图片按比例切割的代码实例
Mar 08 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
Mar 26 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支持页面回退的两种方法[转]
2007/02/14 PHP
PHP编码转换
2012/11/05 PHP
用php实现选择排序的解决方法
2013/05/04 PHP
PHP中单引号与双引号的区别分析
2014/08/19 PHP
详解PHP中的null合并运算符
2015/12/30 PHP
asp 取文本框名称代码
2008/12/02 Javascript
在IE上直接编辑网页内容的js代码(IE地址栏js)
2009/04/27 Javascript
IE下写xml文件的两种方式(fso/saveAs)
2013/08/05 Javascript
javascript中var的重要性分析
2015/02/11 Javascript
7个有用的jQuery代码片段分享
2015/05/19 Javascript
深入浅出ES6之let和const命令
2016/08/25 Javascript
jquery 中toggle的2种用法详解(推荐)
2016/09/02 Javascript
基于Javascript倒计时效果
2016/12/22 Javascript
AngularJS 限定$scope的范围实例详解
2017/06/23 Javascript
详解webpack提取第三方库的正确姿势
2017/12/22 Javascript
如何在vue中使用ts的示例代码
2018/02/28 Javascript
快速搭建vue2.0+boostrap项目的方法
2018/04/09 Javascript
js获取form表单中name属性的值
2019/02/27 Javascript
详解Node.js一行命令上传本地文件到服务器
2019/04/22 Javascript
Js数组扁平化实现方法代码总汇
2020/11/11 Javascript
[02:05]2014DOTA2西雅图邀请赛 专访啸天mik夫妻档
2014/07/08 DOTA
[01:02:38]DOTA2-DPC中国联赛定级赛 LBZS vs Phoenix BO3第二场 1月10日
2021/03/11 DOTA
python中关于日期时间处理的问答集锦
2013/03/08 Python
Python利用字典将两个通讯录文本合并为一个文本实例
2018/01/16 Python
打包python 加icon 去掉cmd黑窗口方法
2019/06/24 Python
python实现图片,视频人脸识别(dlib版)
2020/11/18 Python
css3中仿放大镜效果的几种方式原理解析
2020/12/03 HTML / CSS
使用phonegap操作数据库的实现方法
2017/03/31 HTML / CSS
TripAdvisor西班牙官方网站:全球领先的旅游网站
2018/01/10 全球购物
一些Unix笔试题和面试题
2012/09/25 面试题
监理员的岗位职责
2013/11/13 职场文书
先进事迹报告会主持词
2014/04/02 职场文书
医德医风学习心得体会
2016/01/25 职场文书
机关单位2016年法制宣传日活动总结
2016/04/01 职场文书
HTML+VUE分页实现炫酷物联网大屏功能
2021/05/27 Vue.js
HashMap实现保存两个key相同的数据
2021/06/30 Java/Android