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 相关文章推荐
新浪新闻小偷
Oct 09 PHP
浅谈PHP 闭包特性在实际应用中的问题
Oct 30 PHP
PHP is_dir() 判断给定文件名是否是一个目录
May 10 PHP
php批量上传的实现代码
Jun 09 PHP
编译php 5.2.14+fpm+memcached(具体操作详解)
Jun 18 PHP
PHP执行Curl时报错提示CURL ERROR: Recv failure: Connection reset by peer的解决方法
Jun 26 PHP
php 伪造ip以及url来路信息方法汇总
Nov 25 PHP
php实现俄罗斯乘法实例
Mar 07 PHP
PHP memcache在微信公众平台的应用方法示例
Sep 13 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
Jun 16 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
Feb 18 PHP
yii2.0框架多模型操作示例【添加/修改/删除】
Apr 13 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的无限分类实现想法~
2007/01/02 PHP
PHP判断远程url是否有效的几种方法小结
2011/10/08 PHP
php三种实现多线程类似的方法
2015/10/30 PHP
微信公众号判断用户是否已关注php代码解析
2016/06/24 PHP
获取JavaScript用户自定义类的类名称的代码
2007/03/08 Javascript
javascript取消文本选定的实现代码
2010/11/14 Javascript
js创建数据共享接口——简化框架之间相互传值
2011/10/23 Javascript
jquery中push()的用法(数组添加元素)
2014/11/25 Javascript
node.js中的path.delimiter方法使用说明
2014/12/09 Javascript
JavaScript给url网址进行encode编码的方法
2015/03/18 Javascript
使用AngularJS来实现HTML页面嵌套的方法
2015/06/17 Javascript
基于ajax实现文件上传并显示进度条
2015/08/03 Javascript
jquery中的工具使用方法$.isFunction, $.isArray(), $.isWindow()
2015/08/09 Javascript
JS平滑无缝滚动效果的实现代码
2016/05/06 Javascript
EasyUI加载完Html内容样式渲染完成后显示
2016/07/25 Javascript
jQuery实现点击行选中或取消CheckBox的方法
2016/08/01 Javascript
D3.js实现直方图的方法详解
2016/09/25 Javascript
jQuery插件zTree实现获取一级节点数据的方法
2017/03/08 Javascript
Node.js通过身份证号验证年龄、出生日期与性别方法示例
2017/03/09 Javascript
利用vue+elementUI实现部分引入组件的方法详解
2017/11/22 Javascript
编写更好的JavaScript条件式和匹配条件的技巧(小结)
2019/06/27 Javascript
js实现一款简单踩白块小游戏(曾经很火)
2019/12/02 Javascript
pyqt5简介及安装方法介绍
2018/01/31 Python
python爬取淘宝商品详情页数据
2018/02/23 Python
使用memory_profiler监测python代码运行时内存消耗方法
2018/12/03 Python
【python】matplotlib动态显示详解
2019/04/11 Python
selenium 安装与chromedriver安装的方法步骤
2019/06/12 Python
Selenium+Python 自动化操控登录界面实例(有简单验证码图片校验)
2019/06/28 Python
python 监测内存和cpu的使用率实例
2019/11/28 Python
浅析Python 抽象工厂模式的优缺点
2020/07/13 Python
python GUI计算器的实现
2020/10/09 Python
关于PyCharm安装后修改路径名称使其可重新打开的问题
2020/10/20 Python
美国东北部户外服装和设备零售商:Eastern Mountain Sports
2016/10/05 全球购物
体育教师自荐信范文
2013/12/16 职场文书
公路施工安全责任书
2015/05/08 职场文书
什么是css原子化,有什么用?
2022/04/24 HTML / CSS