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发送邮件类代码附详细说明
Jul 10 PHP
PHP 程序员应该使用的10个组件
Oct 31 PHP
PHP中json_encode、json_decode与serialize、unserialize的性能测试分析
Jun 09 PHP
Yii PHP Framework实用入门教程(详细介绍)
Jun 18 PHP
浅析PHP原理之变量(Variables inside PHP)
Aug 09 PHP
ThinkPHP验证码使用简明教程
Mar 05 PHP
PHP SESSION的增加、删除、修改、查看操作
Mar 20 PHP
万能的php分页类
Jul 06 PHP
PHP递归实现文件夹的复制、删除、查看大小操作示例
Aug 11 PHP
PHP实现的权重算法示例【可用于游戏根据权限来随机物品】
Feb 15 PHP
PHP设计模式(七)组合模式Composite实例详解【结构型】
May 02 PHP
PHP实现简单注册登录系统
Dec 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
再说下636单管机
2021/03/02 无线电
php中大括号作用介绍
2012/03/22 PHP
Fine Uploader文件上传组件应用介绍
2013/01/06 PHP
检查用户名是否已在mysql中存在的php写法
2014/01/20 PHP
PDO::getAttribute讲解
2019/01/28 PHP
Thinkphp5框架异常处理操作实例分析
2020/06/03 PHP
extjs 学习笔记(三) 最基本的grid
2009/10/15 Javascript
初试jQuery EasyUI 使用介绍
2010/04/01 Javascript
jquery控制display属性为none或block
2014/03/31 Javascript
chrome下jq width()方法取值为0的解决方法
2014/05/26 Javascript
解决checkbox的attr(checked)一直为undefined问题
2014/06/16 Javascript
AngularJS身份验证的方法
2016/02/17 Javascript
JavaScript入门系列之知识点总结
2016/03/24 Javascript
Bootstrap组件系列之福利篇几款好用的组件(推荐二)
2016/07/12 Javascript
jQuery使用deferreds串行多个ajax请求
2016/08/22 Javascript
canvas绘制表盘时钟
2017/01/23 Javascript
javascript编写简易计算器
2017/05/06 Javascript
详解使用angular的HttpClient搭配rxjs
2017/09/01 Javascript
BetterScroll 在移动端滚动场景的应用
2017/09/18 Javascript
浅谈AngularJS中$http服务的简单用法
2018/05/15 Javascript
Vue 让元素抖动/摆动起来的实现代码
2018/05/31 Javascript
[06:57]DOTA2-DPC中国联赛 正赛 Ehome vs PSG.LGD 选手采访
2021/03/11 DOTA
Python 深入理解yield
2008/09/06 Python
Python使用htpasswd实现基本认证授权的例子
2014/06/10 Python
Python3基础之基本数据类型概述
2014/08/13 Python
说说如何遍历Python列表的方法示例
2019/02/11 Python
python  ceiling divide 除法向上取整(或小数向上取整)的实例
2019/12/27 Python
python 基于UDP协议套接字通信的实现
2021/01/22 Python
斯德哥尔摩通票:Stockholm Pass
2018/01/09 全球购物
构造器Constructor是否可被override?
2013/08/06 面试题
编程用JAVA解析XML的方式
2013/07/07 面试题
简历中自我评价分享
2013/10/09 职场文书
旅游管理专业个人求职信范文
2013/12/24 职场文书
电气工程及其自动化专业求职信
2014/06/23 职场文书
农村党支部书记四风问题个人对照检查材料
2014/09/21 职场文书
python中24小时制转换为12小时制的方法
2021/06/18 Python