用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 缓存函数代码
Aug 27 PHP
一道关于php变量引用的面试题
Aug 08 PHP
php中使用exec,system等函数调用系统命令的方法(不建议使用,可导致安全问题)
Sep 07 PHP
在windows平台上构建自己的PHP实现方法(仅适用于php5.2)
Jul 05 PHP
smarty模板引擎从配置文件中获取数据的方法
Jan 22 PHP
PHP获取ip对应地区和使用网络类型的方法
Mar 11 PHP
了解PHP的返回引用和局部静态变量
Jun 04 PHP
PHP入门教程之会话控制技巧(cookie与session)
Sep 11 PHP
php通过PHPExcel导入Excel表格到MySQL数据库的简单实例
Oct 29 PHP
Zend Framework入门教程之Zend_Config组件用法详解
Dec 09 PHP
thinkphp5框架实现的自定义扩展类操作示例
May 16 PHP
Thinkphp自定义生成缩略图尺寸的方法
Aug 05 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 SQL防注入代码集合
2008/04/25 PHP
用PHP进行MySQL删除记录操作代码
2008/06/07 PHP
PHP获取中英混合字符串长度的方法
2014/06/07 PHP
PHP中SESSION的注销与清除
2015/04/16 PHP
PHP输出XML格式数据的方法总结
2017/02/08 PHP
jquery 实现的全选和反选
2009/04/15 Javascript
基于jQuery图片平滑连续滚动插件
2009/04/27 Javascript
Js如何判断客户端是PC还是手持设备简单分析
2012/11/22 Javascript
javascript之典型高阶函数应用介绍
2013/01/10 Javascript
JS中eval函数的使用示例
2013/07/21 Javascript
javascript随机将第一个dom中的图片添加到第二个div中示例
2013/10/08 Javascript
详谈javascript中DOM的基本属性
2015/02/26 Javascript
PHP+jQuery+Ajax+Mysql如何实现发表心情功能
2015/08/06 Javascript
JS利用cookie记忆当前位置的防刷新导航效果
2015/10/15 Javascript
举例讲解JavaScript中将数组元素转换为字符串的方法
2015/10/25 Javascript
第一次接触神奇的Bootstrap
2016/10/14 Javascript
微信小程序 二维码canvas绘制实例详解
2017/01/06 Javascript
fckeditor部署到weblogic出现xml无法读取及样式不能显示问题的解决方法
2017/03/24 Javascript
实例详解Vue项目使用eslint + prettier规范代码风格
2018/08/20 Javascript
Vue的H5页面唤起支付宝支付功能
2019/04/18 Javascript
django项目登录中使用图片验证码的实现方法
2019/08/15 Python
python利用opencv实现SIFT特征提取与匹配
2020/03/05 Python
python 使用openpyxl读取excel数据
2021/02/18 Python
Nike台湾官方商店:Nike.com (TW)
2017/08/16 全球购物
复古斯堪的纳维亚儿童服装:Baby go Retro
2017/09/09 全球购物
香港万宁官方海外旗舰店:香港健与美连锁店
2018/09/27 全球购物
Superdry极度干燥美国官网:英国制造的服装品牌
2018/11/13 全球购物
Tommy Hilfiger澳洲官网:美国高端休闲领导品牌
2020/12/16 全球购物
金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)-> (一千零一拾一元整)输出
2015/05/29 面试题
新颖的化妆品活动方案
2014/08/21 职场文书
《中国古代诗歌散文欣赏》高中语文教材
2019/08/20 职场文书
教你怎么用python实现字符串转日期
2021/05/24 Python
MyBatis 动态SQL全面详解
2021/10/05 MySQL
HTML中的表单元素介绍
2022/02/28 HTML / CSS
windows server 2016 域环境搭建的方法步骤(图文)
2022/06/25 Servers
微信小程序纯CSS实现无限弹幕滚动效果
2022/09/23 HTML / CSS