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面向对象全攻略 (五) 封装性
Sep 30 PHP
ExtJS与PHP、MySQL实现存储的方法
Apr 02 PHP
PHP-redis中文文档介绍
Feb 07 PHP
利用php获取服务器时间的实现代码
Jun 07 PHP
ThinkPHP视图查询详解
Jun 30 PHP
PHP Streams(流)详细介绍及使用
May 12 PHP
从性能方面考虑PHP下载远程文件的3种方法
Dec 29 PHP
PHP MYSQL实现登陆和模糊查询两大功能
Feb 05 PHP
删除PHP数组中头部、尾部、任意元素的实现代码
Apr 10 PHP
thinkphp整合系列之极验滑动验证码geetest功能
Jun 18 PHP
PHP实现创建一个RPC服务操作示例
Feb 23 PHP
基于ThinkPHP删除目录及目录文件函数
Oct 28 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 adodb连接不同数据库
2009/03/19 PHP
支持中文和其他编码的php截取字符串函数分享(截取中文字符串)
2014/03/13 PHP
php把数据表导出为Excel表的最简单、最快的方法(不用插件)
2014/05/10 PHP
php中获取主机名、协议及IP地址的方法
2014/11/18 PHP
详解PHP错误日志的获取方法
2015/07/20 PHP
php冒泡排序与快速排序实例详解
2015/12/07 PHP
php使用filter_var函数判断邮箱,url,ip格式示例
2019/07/06 PHP
JQuyer $.post 与 $.ajax 访问WCF ajax service 时的问题需要注意的地方
2011/09/20 Javascript
jquery无法设置checkbox选中即没有变成选中状态
2014/03/27 Javascript
angularJS 如何读写缓冲的方法(推荐)
2016/08/06 Javascript
echart简介_动力节点Java学院整理
2017/08/11 Javascript
javascript sort()对数组中的元素进行排序详解
2019/10/13 Javascript
JavaScript使用prototype属性实现继承操作示例
2020/05/22 Javascript
Vue 如何使用props、emit实现自定义双向绑定的实现
2020/06/05 Javascript
Postman动态获取返回值过程详解
2020/06/30 Javascript
js实现3D粒子酷炫动态旋转特效
2020/09/13 Javascript
js 图片懒加载的实现
2020/10/21 Javascript
[01:00:49]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第二场 1月31日
2021/03/11 DOTA
理解python正则表达式
2016/01/15 Python
python 自动化将markdown文件转成html文件的方法
2016/09/23 Python
python下载图片实现方法(超简单)
2017/07/21 Python
Python实战购物车项目的实现参考
2019/02/20 Python
python实现AES和RSA加解密的方法
2019/03/28 Python
django 类视图的使用方法详解
2019/07/24 Python
django 读取图片到页面实例
2020/03/27 Python
Python3如何使用多线程升程序运行速度
2020/08/11 Python
GNC健安喜美国官网:美国第一营养品牌
2016/07/22 全球购物
Python中pass语句的作用是什么
2016/06/01 面试题
临床医学大学生求职信
2013/09/28 职场文书
应用数学自荐书范文
2013/11/24 职场文书
聚美优品的广告词
2014/03/14 职场文书
《音乐之都维也纳》教学反思
2014/04/16 职场文书
村委会贫困证明范本
2014/09/17 职场文书
就业推荐表院系意见
2015/06/05 职场文书
2016党员党章学习心得体会
2016/01/14 职场文书
分享Python获取本机IP地址的几种方法
2022/03/17 Python