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模板,主要想体现一下思路
Dec 25 PHP
php实现保存submit内容之后禁止刷新
Mar 19 PHP
php实现的常见排序算法汇总
Sep 08 PHP
php通过baihui网API实现读取word文档并展示
Jun 22 PHP
PHP网站建设的流程与步骤分享
Sep 25 PHP
php实现遍历多维数组的方法
Nov 25 PHP
在WordPress中使用PHP脚本来判断访客来自什么国家
Dec 10 PHP
PHP数组实例详解
Jun 26 PHP
利用php做服务器和web前端的界面进行交互
Oct 31 PHP
php获取linux命令结果的实例
Mar 13 PHP
PHP调用其他文件中的类
Apr 02 PHP
php正确输出json数据的实例讲解
Aug 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中for与foreach的区别分析
2011/03/09 PHP
解析在PHP中使用mysqli扩展库对mysql的操作
2013/07/03 PHP
thinkphp分页集成实例
2017/07/24 PHP
PHP数组对象与Json转换操作实例分析
2019/10/22 PHP
firefox下对ajax的onreadystatechange的支持情况分析
2009/12/14 Javascript
纯JS实现根据CSS的class选择DOM
2014/03/22 Javascript
jQuery实现仿淘宝带有指示条的图片转动切换效果完整实例
2015/03/04 Javascript
Javascript缓存API
2016/06/14 Javascript
Bootstrap Table使用方法详解
2016/08/01 Javascript
AngularJS路由切换实现方法分析
2017/03/17 Javascript
详解Angular4中路由Router类的跳转navigate
2017/06/09 Javascript
JavaScript之iterable_动力节点Java学院整理
2017/06/29 Javascript
layer弹出层父子页面事件相互调用方法
2018/08/17 Javascript
Node.js实现一个HTTP服务器的方法示例
2019/05/13 Javascript
微信小程序开发中var that =this的用法详解
2020/01/18 Javascript
[59:15]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第一场 11.20
2020/11/20 DOTA
numpy自动生成数组详解
2017/12/15 Python
Python爬虫实例_城市公交网络站点数据的爬取方法
2018/01/10 Python
用python与文件进行交互的方法
2018/03/01 Python
python实现飞机大战
2018/09/11 Python
解决Shell执行python文件,传参空格引起的问题
2018/10/30 Python
简单了解Pandas缺失值处理方法
2019/11/16 Python
python 实现turtle画图并导出图片格式的文件
2019/12/07 Python
python修改微信和支付宝步数的示例代码
2020/10/12 Python
英国最大的割草机购买网站:Just Lawnmowers
2019/11/02 全球购物
英国知名小木屋定制网站:Tiger Sheds
2020/03/06 全球购物
python+selenium小米商城红米K40手机自动抢购的示例代码
2021/03/24 Python
卫校中专生个人自我评价
2013/09/19 职场文书
敬老文明号事迹材料
2014/01/16 职场文书
员工团队活动方案
2014/08/28 职场文书
2014年乡镇个人工作总结
2014/12/03 职场文书
2015年社区重阳节活动总结
2015/07/30 职场文书
中秋节感想
2015/08/10 职场文书
小学六一儿童节活动开幕词
2016/03/04 职场文书
Pytorch中TensorBoard及torchsummary的使用详解
2021/05/12 Python
解析MySQL索引的作用
2022/03/03 MySQL