根据the POST method uploads section的the 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']
一起使用似乎相当多余。不是吗?
答案 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
。当你有一个完整的解析路径并且你只想获得路径的最后一部分时,它很有用。