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桌面中心(四) 数据显示
Mar 11 PHP
PHP数组 为文章加关键字连接 文章内容自动加链接
Dec 29 PHP
php 模拟get_headers函数的代码示例
Apr 27 PHP
定义php常量的详解
Jun 09 PHP
Windows7下的php环境配置教程
Feb 28 PHP
mac系统下安装多个php并自由切换的方法详解
Apr 21 PHP
php文件上传及下载附带显示文件及目录功能
Apr 27 PHP
PHP中Notice错误常见解决方法
Apr 28 PHP
PHP7.0连接DB操作实例分析【基于mysqli】
Sep 26 PHP
解决laravel(5.5)访问public报错的问题
Oct 12 PHP
PHP的new static和new self的区别与使用
Nov 27 PHP
PHP与Web页面交互操作实例分析
Jun 02 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实现生成code128条形码的方法详解
2017/07/19 PHP
TP5框架使用QueryList采集框架爬小说操作示例
2020/03/26 PHP
Javascript-Mozilla和IE中的一个函数直接量的问题
2007/01/09 Javascript
遍历DOM对象内的元素属性示例代码
2014/02/08 Javascript
给before和after伪元素设置js效果的方法
2015/12/04 Javascript
jQuery插件Validate实现自定义校验结果样式
2016/01/18 Javascript
JS获取屏幕高度的简单实现代码
2016/05/24 Javascript
AngularJS入门教程引导程序
2016/08/18 Javascript
javascript 解决浏览器不支持的问题
2016/09/24 Javascript
简单谈谈axios中的get,post方法
2017/06/25 Javascript
vue toggle做一个点击切换class(实例讲解)
2018/03/13 Javascript
Vue 理解之白话 getter/setter详解
2019/04/16 Javascript
vue实现绑定事件的方法实例代码详解
2019/06/20 Javascript
python实现根据用户输入从电影网站获取影片信息的方法
2015/04/07 Python
举例讲解Python中的死锁、可重入锁和互斥锁
2015/11/05 Python
Python实现邮件的批量发送的示例代码
2018/01/23 Python
Python中安装easy_install的方法
2018/11/18 Python
python+PyQT实现系统桌面时钟
2020/06/16 Python
python使用xlrd模块读取xlsx文件中的ip方法
2019/01/11 Python
使用Python的SymPy库解决数学运算问题的方法
2019/03/27 Python
numpy.where() 用法详解
2019/05/27 Python
python pillow模块使用方法详解
2019/08/30 Python
Pytorch evaluation每次运行结果不同的解决
2020/01/02 Python
pandas 强制类型转换 df.astype实例
2020/04/09 Python
python实现批量转换图片为黑白
2020/06/16 Python
Django权限控制的使用
2021/01/07 Python
[原创]赚疯了!转手立赚800+?大佬的python「抢茅台脚本」使用教程
2021/01/12 Python
贝尔帐篷精品店:Bell Tent Boutique
2019/06/12 全球购物
怎样创建、运行java程序
2014/08/01 面试题
什么是命名空间(NameSpace)
2015/11/24 面试题
Linux面试题LINUX系统类
2015/11/25 面试题
银行员工辞职信范文
2014/01/20 职场文书
优秀幼教自荐信
2014/02/03 职场文书
2019财务管理制度最新范本!
2019/07/09 职场文书
python周期任务调度工具Schedule使用详解
2021/11/23 Python
【DOTA2】半决赛强强对话~ PSG LGD vs EHOME - DPC 2022 CN REGIONAL FINALS WINTER
2022/04/02 DOTA