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 相关文章推荐
Breeze 文章管理系统 v1.0.0正式发布
Dec 14 PHP
PHP 检查扩展库或函数是否可用的代码
Apr 06 PHP
浅谈php扩展imagick
Jun 02 PHP
深入分析PHP引用(&)
Sep 04 PHP
Chrome Web App开发小结
Sep 04 PHP
php支付宝接口用法分析
Jan 04 PHP
smarty中常用方法实例总结
Aug 07 PHP
PHP计算数组中值的和与乘积的方法(array_sum与array_product函数)
Apr 01 PHP
老生常谈文本文件和二进制文件的区别
Feb 27 PHP
详谈php ip2long 出现负数的原因及解决方法
Apr 05 PHP
PHP编程实现多维数组按照某个键值排序的方法小结【2种方法】
Apr 27 PHP
php模拟post提交请求调用接口示例解析
Aug 07 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
解决中英文字符串长度问题函数
2007/01/16 PHP
php操作memcache缓存方法分享
2015/06/03 PHP
thinkPHP5框架导出Excel文件简单操作示例
2018/08/03 PHP
firefox火狐浏览器与与ie兼容的2个问题总结
2010/07/20 Javascript
点击按钮或链接不跳转只刷新页面的脚本整理
2013/10/22 Javascript
javascript记住用户名和登录密码(两种方式)
2015/08/04 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(二)
2016/02/16 Javascript
JavaScript设计模式之单例模式详解
2017/06/09 Javascript
Javascript实现跨域后台设置拦截的方法详解
2017/08/04 Javascript
关于JavaScript语句后面的分号问题
2017/12/07 Javascript
微信小程序scroll-x失效的完美解决方法
2018/07/18 Javascript
React传值 组件传值 之间的关系详解
2019/08/26 Javascript
JavaScript代码异常监控实现过程详解
2020/02/17 Javascript
Vue项目利用axios请求接口下载excel
2020/11/17 Vue.js
vue基于Echarts的拖拽数据可视化功能实现
2020/12/04 Vue.js
python写的一个squid访问日志分析的小程序
2014/09/17 Python
浅谈Python peewee 使用经验
2017/10/20 Python
人机交互程序 python实现人机对话
2017/11/14 Python
Python的SimpleHTTPServer模块用处及使用方法简介
2018/01/22 Python
python实现求特征选择的信息增益
2018/12/18 Python
pyqt5实现登录界面的模板
2020/05/30 Python
sklearn的predict_proba使用说明
2020/06/28 Python
python 三种方法提取pdf中的图片
2021/02/07 Python
美国购买和销售礼品卡平台:Raise
2017/01/13 全球购物
找到您丢失的钥匙、钱包和手机:Tile
2017/05/19 全球购物
美国踏板车和轻便摩托车销售网站:Mega Motor Madness
2020/02/26 全球购物
美国名牌香水折扣网站:Hottperfume
2021/02/10 全球购物
学生党员思想汇报
2013/12/28 职场文书
聚美优品的广告词
2014/03/14 职场文书
《莫泊桑拜师》教学反思
2014/04/23 职场文书
3分钟演讲稿
2014/04/30 职场文书
中药学专业毕业生推荐信
2014/07/10 职场文书
2014年财务个人工作总结
2014/12/08 职场文书
2019行政前台转正申请书范文3篇
2019/08/15 职场文书
pytorch实现手写数字图片识别
2021/05/20 Python
win10系统计算机图标怎么调出来?win10调出计算机图标的方法
2022/08/14 数码科技