is_uploaded_file函数引发的不能上传文件问题


Posted in PHP onOctober 29, 2013

起因:

在一个项目中,接到用户反馈说其所有客户不能上传文件,都返回失败。经过排查发现是PHP中的is_uploaded_file函数在捣鬼。

细节分析:

在正常情况下,通过PHP 上传文件 ,需要通过is_uploaded_file函数来判断文件是否是通过 HTTP POST 上传的,这可以用来确保恶意的用户无法欺骗脚本去访问本不能访问的文件,例如 /etc/passwd。
而本次遇到的问题是本来应该是C:/WINDOWS/Temp/php99.tmp这样的tmp_name,却变成了C://WINDOWS //Temp//php99.tmp这种,导致is_uploaded_file函数返回错误的信息。

处理方式:

在加上如下代码后,问题解决。
$file['tmp_name'] = str_replace('////', ‘//', $file['tmp_name']);
注意,“////”实际字符串就是两个/,其他两个是用来表示转义的。

深入研究:

为什么在默写特定的环境下会出现这种情况呢,我们来看如下分析:
; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = On
在PHP的默认配置中magic_quotes_gpc是On的,而打开了magic_quotes_gpc参数的PHP环境会自动对GET/POST /Cookie添加addslashes效果。注意,并不会为$_FILES添加addslashes效果。
而当magic_quotes_gpc是Off的时候,由于为$_FILES数组添加了addslashes作用,反而出现了问题。也就在 magic_quotes_gpc是Off的PHP环境下都会出现此问题。

顺带说句,SVN上的MooPHP代码已经修复此问题。

is_uploaded_file函数解析:

判断文件是否是通过 HTTP POST 上传的
bool is_uploaded_file ( string $filename )
如果 filename 所给出的文件是通过 HTTP POST 上传的则返回 TRUE。这可以用来确保恶意的用户无法欺骗脚本去访问本不能访问的文件,例如 /etc/passwd。 这种检查显得格外重要,如果上传的文件有可能会造成对用户或本系统的其他用户显示其内容的话。

为了能使 is_uploaded_file() 函数正常工作,必段指定类似于 $_FILES['userfile']['tmp_name'] 的变量,而在从客户端上传的文件名 $_FILES['userfile']['name'] 不能正常运作。

PHP 相关文章推荐
PHP DataGrid 实现代码
Aug 12 PHP
PHP 开发环境配置(Zend Server安装)
Apr 28 PHP
PHP curl_setopt()函数实例代码与参数分析
Jun 02 PHP
php获取淘宝分类id示例
Jan 16 PHP
PHP获取当前相对于域名目录的方法
Jun 26 PHP
简单介绍PHP的责任链编程模式
Aug 11 PHP
php多线程实现方法及用法实例详解
Oct 26 PHP
thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法
May 19 PHP
PHP加密解密类实例代码
Jul 20 PHP
php简单计算年龄的方法(周岁与虚岁)
Dec 06 PHP
php实现xml转换数组的方法示例
Feb 03 PHP
PHP异常处理定义与使用方法分析
Jul 25 PHP
单点登录 Ucenter示例分析
Oct 29 #PHP
php中过滤非法字符的具体实现
Oct 29 #PHP
PHP时间戳 strtotime()使用方法和技巧
Oct 29 #PHP
PHP页面中文乱码分析
Oct 29 #PHP
php四种基础算法代码实例
Oct 29 #PHP
教你如何使用php session
Oct 28 #PHP
php字符编码转换之gb2312转为utf8
Oct 28 #PHP
You might like
如何在smarty中增加类似foreach的功能自动加载数据
2013/06/26 PHP
PHP的变量类型和作用域详解
2014/03/12 PHP
Laravel Eloquent分表方法并使用模型关联的实现
2019/11/25 PHP
jQuery的实现原理的模拟代码 -1 核心部分
2010/08/01 Javascript
初学js插入节点appendChild insertBefore使用方法
2011/07/04 Javascript
JS打印gridview实现原理及代码
2013/02/05 Javascript
js自动生成对象的属性示例代码
2013/10/28 Javascript
JS冒泡事件的快速解决方法
2013/12/16 Javascript
JavaScript实现输入框与清空按钮联动效果
2016/09/09 Javascript
关于验证码在IE中不刷新的快速解决方法
2016/09/23 Javascript
理解javascript async的用法
2017/08/22 Javascript
谈谈vue中mixin的一点理解
2017/12/12 Javascript
VUE2.0+Element-UI+Echarts封装的组件实例
2018/03/02 Javascript
vue keep-alive请求数据的方法示例
2018/05/16 Javascript
微信小程序实现的picker多级联动功能示例
2019/05/23 Javascript
vue 指令和过滤器的基本使用(品牌管理案例)
2019/11/04 Javascript
Python中用Decorator来简化元编程的教程
2015/04/13 Python
python中如何使用朴素贝叶斯算法
2017/04/06 Python
利用pandas进行大文件计数处理的方法
2018/07/25 Python
Python实现带参数的用户验证功能装饰器示例
2018/12/14 Python
Centos部署django服务nginx+uwsgi的方法
2019/01/02 Python
python抓取搜狗微信公众号文章
2019/04/01 Python
python+webdriver自动化环境搭建步骤详解
2019/06/03 Python
基于python-opencv3的图像显示和保存操作
2019/06/27 Python
django框架auth模块用法实例详解
2019/12/10 Python
python 通过邮件控制实现远程控制电脑操作
2020/03/16 Python
雅诗兰黛美国官网:Estee Lauder美国
2016/07/21 全球购物
美国一家著名的儿童鞋制造商:Stride Rite
2017/01/02 全球购物
写出一个方法实现冒泡排序
2016/07/08 面试题
高校辅导员推荐信范文
2013/12/25 职场文书
活动总结范文
2014/08/30 职场文书
个人四风问题整改措施
2014/10/24 职场文书
民间借贷借条如何写
2015/05/26 职场文书
电力安全教育培训心得体会
2016/01/11 职场文书
JS创建或填充任意长度数组的小技巧汇总
2021/10/24 Javascript
MySQL示例讲解数据库约束以及表的设计
2022/06/16 MySQL