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新手上路(十二)
Oct 09 PHP
关于在php.ini中添加extension=php_mysqli.dll指令的说明
Jun 14 PHP
phpmyadmin 访问被拒绝的真实原因
Jun 15 PHP
php实现jQuery扩展函数
Oct 30 PHP
PHP中for与foreach的区别分析
Mar 09 PHP
PHP弹出提示框并跳转到新页面即重定向到新页面
Jan 24 PHP
PHP实现利用MySQL保存session的方法
Aug 23 PHP
phpcms中的评论样式修改方法
Oct 21 PHP
PHP重置数组为连续数字索引的几种方式总结
Mar 12 PHP
PHP使用PDO实现mysql防注入功能详解
Dec 20 PHP
如何运行/调试你的PHP代码
Oct 23 PHP
php中配置文件保存修改操作 如config.php文件的读取修改等操作
May 12 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版本如何选择?应该使用哪个版本?
2015/05/13 PHP
php 微信公众平台开发模式实现多客服的实例代码
2016/11/07 PHP
laravel 框架结合关联查询 when()用法分析
2019/11/22 PHP
利用javascript移动div层-javascript 拖动层
2009/03/22 Javascript
jquery 图片上传按比例预览插件集合
2011/05/28 Javascript
基于Jquery实现表格动态分页实现代码
2011/06/21 Javascript
Jquery post传递数组方法实现思路及代码
2013/04/28 Javascript
js替换字符串的所有示例代码
2013/07/23 Javascript
Jquery解析json数据详解
2013/12/26 Javascript
js和css写一个可以自动隐藏的悬浮框
2014/03/05 Javascript
JS取得绝对路径的实现代码
2015/01/16 Javascript
javascript实现点击商品列表checkbox实时统计金额的方法
2015/05/15 Javascript
微信小程序 在Chrome浏览器上运行以及WebStorm的使用
2016/09/27 Javascript
微信小程序之ES6与事项助手的功能实现
2016/11/30 Javascript
JSON字符串和JSON对象相互转化实例详解
2017/01/05 Javascript
jQuery对table表格进行增删改查
2020/12/22 Javascript
详解如何在NodeJS项目中优雅的使用ES6
2017/04/22 NodeJs
使用vue的v-for生成table并给table加上序号的实例代码
2017/10/27 Javascript
Vue 2.0双向绑定原理的实现方法
2019/10/23 Javascript
解决Python安装时报缺少DLL问题【两种解决方法】
2019/07/15 Python
python 五子棋如何获得鼠标点击坐标
2019/11/04 Python
Python求正态分布曲线下面积实例
2019/11/20 Python
如何实现在jupyter notebook中播放视频(不停地展示图片)
2020/04/23 Python
pyspark给dataframe增加新的一列的实现示例
2020/04/24 Python
详解pandas赋值失败问题解决
2020/11/29 Python
python爬虫调度器用法及实例代码
2020/11/30 Python
CSS3中的display:grid,网格布局介绍
2019/10/30 HTML / CSS
详解CSS3中常用的样式【基本文本和字体样式】
2020/10/20 HTML / CSS
毕业自我鉴定总结
2014/03/24 职场文书
应届生求职信范文
2014/06/30 职场文书
员工保密协议书
2014/09/27 职场文书
租车协议书
2015/01/27 职场文书
教师工作决心书
2015/02/04 职场文书
行为规范主题班会
2015/08/13 职场文书
关于Python OS模块常用文件/目录函数详解
2021/07/01 Python
英镑符号 £
2022/02/17 杂记