Yas*_*man 4 php file-upload file
根据该POST方法上传节的PHP手册,$_FILES['userfile']['name']是在客户端计算机上的文件的原始名称.该部分中的示例#2使用如下所示的basename函数$_FILES['userfile']['name']:
$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
Run Code Online (Sandbox Code Playgroud)
我在我的本地主机(Apache 2.2.14,PHP 5.3.1,Windows XP)上做了一些实验,发现以下两行是等价的:
$_FILES['userFile']['name']; // "file.txt"
basename($_FILES['userFile']['name']); // "file.txt"
Run Code Online (Sandbox Code Playgroud)
也就是说,使用basename函数$_FILES['userFile']['name']似乎相当多余.不是吗?
也就是说,使用带有$ _FILES ['userFile'] ['name']的basename函数似乎相当多余.不是吗?
不,首先出于安全原因,@ Gumbo在他的回答中描述; 其次,因为旧版本的IE用于在客户端提供文件的完整路径,例如
C:\Documents and Settings\Username\Desktop\Image_cropped.jpg
Run Code Online (Sandbox Code Playgroud)
这种行为最近就像IE8一样停止了.从这个通过此SO问题发现的MSDN博客条目:
文件上传控件
此外,"上载文件时包括本地目录路径"URLAction已设置为"禁用"Internet区域.此更改可防止潜在敏感的本地文件系统信息泄漏到Internet.例如,Internet Explorer 8现在只提交文件名image.png,而不是提交完整路径C:\ users\ericlaw\documents\secret\image.png.
HTTP请求可以伪造,因此也可以操纵标头中提供的文件名.
如果要确保只提供文件名,请验证该值或对其进行过滤basename以获取文件名.