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 相关文章推荐
Win9x/ME下Apache+PHP安装配置
Oct 09 PHP
php学习之简单计算器实现代码
Jun 09 PHP
使用array mutisort 实现按某字段对数据排序
Jun 18 PHP
php获取网页请求状态程序示例
Jun 17 PHP
PHP rsa加密解密使用方法
Apr 27 PHP
浅谈COOKIE和SESSION区别
Jul 19 PHP
浅谈php+phpStorm+xdebug配置方法
Sep 17 PHP
php curl抓取网页的介绍和推广及使用CURL抓取淘宝页面集成方法
Nov 30 PHP
Symfony2开发之控制器用法实例分析
Feb 05 PHP
PHP简单获取随机数的常用方法小结
Jun 07 PHP
PHP切割整数工具类似微信红包金额分配的思路详解
Sep 18 PHP
Laravel框架源码解析之入口文件原理分析
May 14 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
简单PHP上传图片、删除图片实现代码
2010/05/12 PHP
PHP仿博客园 个人博客(2) 数据库增添改删
2013/07/05 PHP
ThinkPHP之M方法实例详解
2014/06/20 PHP
ThinkPHP框架表单验证操作方法
2017/07/19 PHP
WHOOPS PHP调试库的使用
2017/09/29 PHP
总结PHP内存释放以及垃圾回收
2018/03/29 PHP
php更新cookie内容的详细方法
2019/09/30 PHP
有关PHP 中 config.m4 的探索
2020/08/26 PHP
jQuery UI 应用不同Theme的办法
2010/09/12 Javascript
IE与Firefox在JavaScript上的7个不同句法分享
2011/10/30 Javascript
JQuery实现绚丽的横向下拉菜单
2013/12/19 Javascript
JavaScript运行时库属性一览表
2014/03/14 Javascript
jQuery对象与DOM对象转换方法详解
2016/05/10 Javascript
js判断是否为空和typeof的用法(详解)
2016/10/07 Javascript
js实现百度登录框鼠标拖拽效果
2017/03/07 Javascript
jQuery表格(Table)基本操作实例分析
2017/03/10 Javascript
基于Vue2.0的分页组件
2017/03/16 Javascript
vue表单绑定实现多选框和下拉列表的实例
2017/08/12 Javascript
vue 使用eventBus实现同级组件的通讯
2018/03/02 Javascript
微信小程序实现自上而下字幕滚动
2018/07/14 Javascript
解决python3 urllib 链接中有中文的问题
2018/07/16 Python
PyTorch之nn.ReLU与F.ReLU的区别介绍
2020/06/27 Python
python一些性能分析的技巧
2020/08/30 Python
Python根据字典的值查询出对应的键的方法
2020/09/30 Python
Python实现哲学家就餐问题实例代码
2020/11/09 Python
医药工作者的求职信范文
2013/09/21 职场文书
中西医结合临床医学专业大学生自荐信
2013/09/28 职场文书
档案接收函范文
2014/01/10 职场文书
学校安全生产承诺书
2014/05/23 职场文书
给女朋友道歉的话大全
2015/01/20 职场文书
运动会5000米加油稿
2015/07/21 职场文书
婚宴新郎致辞
2015/07/28 职场文书
2016幼儿教师自荐信范文
2016/01/28 职场文书
协议书格式模板
2016/03/24 职场文书
如何使用Maxwell实时同步mysql数据
2021/04/08 MySQL
源码解读Spring-Integration执行过程
2021/06/11 Java/Android