用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 和 HTML
Oct 09 PHP
在Zeus Web Server中安装PHP语言支持
Oct 09 PHP
php和mysql中uft-8中文编码乱码的几种解决办法
Apr 19 PHP
php+mysql结合Ajax实现点赞功能完整实例
Jan 30 PHP
浅谈本地WAMP环境的搭建
May 13 PHP
PHP 错误处理机制
Jul 06 PHP
ThinkPHP3.2.1图片验证码实现方法
Aug 19 PHP
thinkphp中AJAX返回ajaxReturn()方法分析
Dec 06 PHP
PHP 实现页面静态化的几种方法
Jul 23 PHP
php简单计算权重的方法示例【适合抽奖类应用】
Jun 10 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
Jan 22 PHP
laravel7学习之无限级分类的最新实现方法
Sep 30 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 工厂模式使用方法
2010/05/18 PHP
php获取mysql数据库中的所有表名的代码
2011/04/23 PHP
php 文件上传实例代码
2012/04/19 PHP
PHP超级全局变量数组小结
2012/10/04 PHP
php通过array_merge()函数合并关联和非关联数组的方法
2015/03/18 PHP
thinkphp利用模型通用数据编辑添加和删除的实例代码
2016/11/20 PHP
laravel 框架结合关联查询 when()用法分析
2019/11/22 PHP
JavaScript Date对象 日期获取函数
2010/12/19 Javascript
javascript打印html内容功能的方法示例
2013/11/28 Javascript
使用Browserify配合jQuery进行编程的超级指南
2015/07/28 Javascript
详谈javascript异步编程
2016/02/21 Javascript
易被忽视的js事件问题总结
2016/05/14 Javascript
详解使用VueJS开发项目中的兼容问题
2018/08/02 Javascript
Javascript和jquery在selenium的使用过程
2019/10/31 jQuery
原生JS利用transform实现banner的无限滚动示例代码
2020/06/15 Javascript
python定时执行指定函数的方法
2015/05/27 Python
python中私有函数调用方法解密
2016/04/29 Python
pandas string转dataframe的方法
2018/04/11 Python
pygame实现俄罗斯方块游戏
2018/06/26 Python
Python中staticmethod和classmethod的作用与区别
2018/10/11 Python
Python除法之传统除法、Floor除法及真除法实例详解
2019/05/23 Python
全面了解django的缓存机制及使用方法
2019/07/22 Python
TensorFlow tensor的拼接实例
2020/01/19 Python
Python logging模块handlers用法详解
2020/08/14 Python
CSS3 实现时间轴动画
2020/11/25 HTML / CSS
《月迹》教学反思
2014/02/19 职场文书
创建市级文明单位实施方案
2014/03/01 职场文书
奥巴马就职演讲稿
2014/05/15 职场文书
就业协议书范本
2014/10/08 职场文书
四群教育工作总结
2015/08/10 职场文书
初三语文教学反思
2016/03/03 职场文书
关于antd tree 和父子组件之间的传值问题(react 总结)
2021/06/02 Javascript
MySQL系列之十一 日志记录
2021/07/02 MySQL
python lambda 表达式形式分析
2022/04/03 Python
唤醒紫霞仙子,携手再游三界!大话手游X《大话西游》电影合作专属剧情任务
2022/04/03 其他游戏
浅谈MySql update会锁定哪些范围的数据
2022/06/25 MySQL