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数组应用之比较两个时间的相减排序
Aug 18 PHP
php cookie 作用范围?不要在当前页面使用你的cookie
Mar 24 PHP
PHP 存储文本换行实现方法
Jan 05 PHP
php5.3 废弃函数小结
May 16 PHP
约瑟夫环问题的PHP实现 使用PHP数组内部指针操作函数
Oct 12 PHP
Drupal7连接多个数据库及常见问题解决
Mar 02 PHP
PHP5.3安装Zend Guard Loader图文教程
Sep 29 PHP
浅析Yii2中GridView常见操作
Apr 22 PHP
php模拟post上传图片实现代码
Jun 24 PHP
利用PHP生成静态html页面的原理
Sep 30 PHP
php获取微信基础接口凭证Access_token
Aug 23 PHP
PHP抽象类与接口的区别详解
Mar 21 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源代码
2006/10/09 PHP
如何删除多级目录
2006/10/09 PHP
php中mail函数发送邮件失败的解决方法
2014/12/24 PHP
PHP输出Excel PHPExcel的方法
2018/07/26 PHP
Js中sort()方法的用法
2006/11/04 Javascript
jquery 简单的进度条实现代码
2010/03/11 Javascript
JavaScript面向对象(极简主义法minimalist approach)
2012/07/17 Javascript
怎么判断js脚本加载完成
2014/02/28 Javascript
JavaScript实现文本框中默认显示背景图片在获得焦点后消失的方法
2015/07/01 Javascript
jQuery实现的指纹扫描效果实例(附演示与demo源码下载)
2016/01/26 Javascript
全面解析bootstrap格子布局
2016/05/22 Javascript
详解AngularJS如何实现跨域请求
2016/08/22 Javascript
jQuery实现文字自动横移
2017/01/08 Javascript
JS跨域请求外部服务器的资源
2017/02/06 Javascript
JavaScript Uploadify文件上传实例
2017/02/28 Javascript
详解Vue2 SSR 缓存 Api 数据
2017/11/20 Javascript
微信小程序实现全国机场索引列表
2018/01/31 Javascript
vue: WebStorm设置快速编译运行的方法
2018/10/18 Javascript
vue中的v-if和v-show的区别详解
2019/09/01 Javascript
JavaScript多种滤镜算法实现代码实例
2019/12/10 Javascript
JS 获取文件后缀,判断文件类型(比如是否为图片格式)
2020/05/09 Javascript
Vue.js使用axios动态获取response里的data数据操作
2020/09/08 Javascript
wxPython之解决闪烁的问题
2018/01/15 Python
Python(Django)项目与Apache的管理交互的方法
2018/05/16 Python
麦当劳辞职信范文
2014/01/18 职场文书
幼儿园秋游活动方案
2014/01/21 职场文书
餐厅楼面部长岗位职责范文
2014/02/16 职场文书
信息管理专业自荐书
2014/06/05 职场文书
团日活动总结模板
2014/06/25 职场文书
个人批评与自我批评
2014/10/15 职场文书
北京故宫的导游词
2015/01/31 职场文书
2015年车间主任工作总结
2015/05/21 职场文书
赤壁观后感(2)
2015/06/15 职场文书
篮球赛闭幕式主持词
2015/07/03 职场文书
入党心得体会
2019/06/20 职场文书
古诗文之爱国名句(77句)
2019/09/24 职场文书