是不是使用$ _FILES ['userFile'] ['name']冗余的basename函数?

时间:2010-02-27 10:55:08

标签: php file file-upload

根据the POST method uploads sectionthe PHP Manual$_FILES['userfile']['name']是客户端计算机上文件的原始名称。该部分中的示例#2使用basename函数和$_FILES['userfile']['name'],如下所示:

$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);

我在我的本地主机( Apache 2.2.14,PHP 5.3.1,Windows XP )上做了一些实验,发现以下两行是等效的:

$_FILES['userFile']['name'];            // "file.txt"
basename($_FILES['userFile']['name']);  // "file.txt"

也就是说,将basename函数与$_FILES['userFile']['name']一起使用似乎相当多余。不是吗?

3 个答案:

答案 0 :(得分:9)

  

也就是说,使用带有$ _FILES ['userFile'] ['name']的basename函数似乎相当多余。不是吗?

不,首先出于安全原因,@ Gumbo在他的回答中描述;其次,因为旧版本的IE用于在客户端提供文件的完整路径,例如

C:\Documents and Settings\Username\Desktop\Image_cropped.jpg

该行为最近停止了IE8。从this MSDN blog entry发现的this SO question

  

文件上传控件

     

此外,“上传文件时包含本地目录路径”URLAction已设置为“禁用”Internet区域。此更改可防止潜在敏感的本地文件系统信息泄漏到Internet。例如,不是提交完整路径C:\ users \ ericlaw \ documents \ secret \ image.png,Internet Explorer 8现在只提交文件名image.png。

答案 1 :(得分:5)

可以伪造HTTP请求,因此也可以操纵标头中提供的文件名。

如果您想确保只提供文件名,请验证该值或使用basename对其进行过滤以获取文件名。

答案 2 :(得分:0)

在完整路径上使用basename(),例如/path/mydir/file.txt,返回file.txt。当你有一个完整的解析路径并且你只想获得路径的最后一部分时,它很有用。