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 相关文章推荐
Zend公司全球首推PHP认证
Oct 09 PHP
php设计模式  Command(命令模式)
Jun 17 PHP
php cli 小技巧
Jun 03 PHP
PHP 如何获取二维数组中某个key的集合
Jun 03 PHP
PHP中使用正则表达式提取中文实现笔记
Jan 20 PHP
Laravel 5框架学习之Eloquent 关系
Apr 09 PHP
Zend Framework教程之Zend_Config_Ini用法分析
Mar 23 PHP
PHP Ajax JavaScript Json获取天气信息实现代码
Aug 17 PHP
php文件类型MIME对照表(比较全)
Oct 07 PHP
php魔法函数与魔法常量使用介绍
Jul 23 PHP
CakePHP框架Model关联对象用法分析
Aug 04 PHP
PHP数组常用函数实例小结
Aug 20 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程序61条面向对象分析设计的经验小结
2008/11/12 PHP
Win下如何安装PHP的APC拓展
2013/08/07 PHP
php通过文件头判断格式的方法
2016/05/28 PHP
js onclick事件传参讲解
2013/11/06 Javascript
浅析hasOwnProperty方法的应用
2013/11/20 Javascript
JQuery中clone方法复制节点
2015/05/18 Javascript
用户代理字符串userAgent可实现的四个识别
2015/09/20 Javascript
javascript实现下拉提示选择框
2015/12/29 Javascript
利用Jasmine对Angular进行单元测试的方法详解
2017/06/12 Javascript
微信小程序实现滚动消息通知
2018/02/02 Javascript
浅谈webpack 自动刷新与解析
2018/04/09 Javascript
JavaScript 高性能数组去重的方法
2018/09/20 Javascript
解决vue侦听器watch,调用this时出现undefined的问题
2020/10/30 Javascript
javascript实现前端分页功能
2020/11/26 Javascript
[10:04]国际邀请赛采访专栏:DK.Farseer,mouz.Black^,采访员Josh专访
2013/08/05 DOTA
[40:01]OG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python获取本机mac地址和ip地址的方法
2015/04/29 Python
python密码错误三次锁定(实例讲解)
2017/11/14 Python
关于django 数据库迁移(migrate)应该知道的一些事
2018/05/27 Python
Python日期时间对象转换为字符串的实例
2018/06/22 Python
对pandas的层次索引与取值的新方法详解
2018/11/06 Python
PyTorch 1.0 正式版已经发布了
2018/12/13 Python
浅谈Python采集网页时正则表达式匹配换行符的问题
2018/12/20 Python
python使用参数对嵌套字典进行取值的方法
2019/04/26 Python
解决python 3 urllib 没有 urlencode 属性的问题
2019/08/22 Python
html5 Canvas画图教程(2)—画直线与设置线条的样式如颜色/端点/交汇点
2013/01/09 HTML / CSS
德国箱包网上商店:koffer24.de
2016/07/27 全球购物
捷克购买家具网站:JENA nábytek
2020/03/19 全球购物
白酒市场营销方案
2014/02/25 职场文书
大学军训感言800字
2014/02/27 职场文书
质量月活动策划方案
2014/03/10 职场文书
个人自查自纠材料
2014/10/14 职场文书
2015最新学生自我评价范文
2015/03/03 职场文书
2015年公务员试用期工作总结
2015/05/28 职场文书
酒桌上的开场白
2015/06/01 职场文书
公务员的复习计划书,请收下!
2019/07/15 职场文书