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 相关文章推荐
PHP4在Windows2000下的安装
Oct 09 PHP
php扩展ZF――Validate扩展
Jan 10 PHP
基于xcache的配置与使用详解
Jun 18 PHP
php获取301跳转URL简单实例
Dec 16 PHP
PHP获取客户端真实IP地址的5种情况分析和实现代码
Jul 08 PHP
PHP命令行脚本接收传入参数的三种方式
Aug 20 PHP
学习php开源项目的源码指南
Dec 21 PHP
php使用parse_url和parse_str解析URL
Feb 22 PHP
php编写批量生成不重复的卡号密码代码
May 14 PHP
mac下多个php版本快速切换的方法
Oct 09 PHP
php实现微信支付之退款功能
May 30 PHP
浅谈PHP匿名函数和闭包
Mar 08 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
destoon实现商铺管理主页设置增加新菜单的方法
2014/06/26 PHP
php实现图片转换成ASCII码的方法
2015/04/03 PHP
10个超级有用的PHP代码片段果断收藏
2015/09/23 PHP
Windows2003下php5.4安装配置教程(IIS)
2016/06/30 PHP
Laravel中Facade的加载过程与原理详解
2017/09/22 PHP
Laravel框架实现redis集群的方法分析
2017/09/14 PHP
javascript 一个函数对同一元素的多个事件响应
2009/07/25 Javascript
JSON 教程 json入门学习笔记
2020/09/22 Javascript
JavaScript中的undefined学习总结
2013/11/30 Javascript
javascript避免数字计算精度误差的方法详解
2014/03/05 Javascript
判断字符串的长度(优化版)中文占两个字符
2014/10/30 Javascript
jquery中EasyUI使用技巧小结
2015/02/10 Javascript
JQuery包裹DOM节点的方法
2015/06/11 Javascript
node.js抓取并分析网页内容有无特殊内容的js文件
2015/11/17 Javascript
让你一句话理解闭包(简单易懂)
2016/06/03 Javascript
JavaScript中访问id对象 属性的方式访问属性(实例代码)
2016/10/28 Javascript
jquery表单验证插件validation使用方法详解
2017/01/20 Javascript
巧用canvas
2017/01/21 Javascript
js实现返回顶部效果
2017/03/10 Javascript
详解Vue使用命令行搭建单页面应用
2017/05/24 Javascript
JS动态添加元素及绑定事件造成程序重复执行解决
2017/12/07 Javascript
jQuery实现输入框的放大和缩小功能示例
2018/07/21 jQuery
bootstrap模态框关闭后清除模态框的数据方法
2018/08/10 Javascript
layui select获取自定义属性方法
2018/08/15 Javascript
微信小程序动态增加按钮组件
2018/09/14 Javascript
基于原生js实现判断元素是否有指定class名
2020/07/11 Javascript
Python实现点阵字体读取与转换的方法
2019/01/29 Python
pytorch中的transforms模块实例详解
2019/12/31 Python
四好少年事迹材料
2014/01/12 职场文书
学生鉴定评语大全
2014/05/05 职场文书
庆祝国庆节标语
2014/10/09 职场文书
优秀教师申报材料
2014/12/16 职场文书
期末考试复习计划
2015/01/19 职场文书
运动会通讯稿50字
2015/07/20 职场文书
学雷锋主题班会教案
2015/08/13 职场文书
为什么代码规范要求SQL语句不要过多的join
2021/06/23 MySQL