用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验证码(支持中文)
Feb 14 PHP
php桌面中心(三) 修改数据库
Mar 11 PHP
PHP调用Linux的命令行执行文件压缩命令
Jan 27 PHP
PHP 5.5 创建和验证哈希最简单的方法详解
Nov 07 PHP
thinkphp在模型中自动完成session赋值示例代码
Sep 09 PHP
php curl抓取网页的介绍和推广及使用CURL抓取淘宝页面集成方法
Nov 30 PHP
Paypal实现循环扣款(订阅)功能
Mar 23 PHP
php使用curl_init()和curl_multi_init()多线程的速度比较详解
Aug 15 PHP
详解PHP变量传值赋值和引用赋值变量销毁
Mar 23 PHP
关于laravel-admin ueditor 集成并解决刷新的问题
Oct 21 PHP
PHPExcel实现的读取多工作表操作示例
Apr 14 PHP
PHP7 新增常量
Mar 09 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/03/11 PHP
CodeIgniter常用知识点小结
2016/05/26 PHP
静态html文件执行php语句的方法(推荐)
2016/11/21 PHP
Jquery 模拟用户点击超链接或者按钮的方法
2013/10/25 Javascript
JS画线(实例代码)
2013/11/20 Javascript
如何判断元素是否为HTMLElement元素
2013/12/06 Javascript
深入解析JavaScript编程中的this关键字使用
2015/11/09 Javascript
this,this,再次讨论javascript中的this,超全面(经典)
2016/01/05 Javascript
JavaScript 浏览器兼容性总结及常用浏览器兼容性分析
2016/03/30 Javascript
AngularJS包括详解及示例代码
2016/08/17 Javascript
js显示动态时间的方法详解
2016/08/20 Javascript
详解MVC如何使用开源分页插件(shenniu.pager.js)
2016/12/16 Javascript
Bootstrap 模态框实例插件案例分析
2016/12/28 Javascript
解决vue.js 数据渲染成功仍报错的问题
2018/08/25 Javascript
微信小程序scroll-view点击项自动居中效果的实现
2020/03/25 Javascript
详解Vue 数据更新了但页面没有更新的 7 种情况汇总及延伸总结
2020/05/28 Javascript
python多重继承新算法C3介绍
2014/09/28 Python
Linux下编译安装MySQL-Python教程
2015/02/02 Python
Python 安装setuptools和pip工具操作方法(必看)
2017/05/22 Python
python flask 多对多表查询功能
2017/06/25 Python
Ubuntu16.04/树莓派Python3+opencv配置教程(分享)
2018/04/02 Python
Python + selenium自动化环境搭建的完整步骤
2018/05/19 Python
Python根据指定日期计算后n天,前n天是哪一天的方法
2018/05/29 Python
使用pip安装python库的多种方式
2019/07/31 Python
python元组的概念知识点
2019/11/19 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧装饰器信号与槽详细使用方法与实例
2020/03/06 Python
移动Web—CSS为Retina屏幕替换更高质量的图片
2012/12/24 HTML / CSS
修复iPhone的safari浏览器上submit按钮圆角bug
2012/12/24 HTML / CSS
和睦家庭事迹
2014/05/14 职场文书
查摆问题对照检查材料
2014/08/28 职场文书
缅怀先烈演讲稿
2014/09/03 职场文书
体育专业大学生职业生涯规划范文:打造自己的运动帝国
2014/09/12 职场文书
师范生见习报告
2014/10/31 职场文书
幼儿园教师个人总结
2015/02/05 职场文书
2014年度个人工作总结范文
2015/03/09 职场文书
《敬重卑微》读后感3篇
2019/11/26 职场文书