2010-02-27 15 views
2

根據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']似乎相當多餘。不是嗎?

回答

8

也就是說,使用$ _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。例如,Internet Explorer 8現在只提交文件名image.png,而不是提交完整路徑C:\ users \ ericlaw \ documents \ secret \ image.png。

+0

啊,信息泄漏不錯。 – Gumbo 2010-02-27 11:03:49

+0

+1尼斯確實發現。 – Gordon 2010-02-27 11:04:55

+0

@Gordon歡呼。 @Gumbo重新泄漏:真實,但它在內容管理系統中保存上傳資源的原始位置非常有用。我真的很想念這個功能。很高興知道它可以使用區域模型重新激活。 – 2010-02-27 11:05:15

0

在完整路徑上使用basename(),例如/path/mydir/file.txt,返回您file.txt。它有用,當你有一個完整的路徑解析,你只是想獲得路徑的最後部分。

5

可以僞造HTTP請求,因此也可以處理標題中提供的文件名。

如果要確保只給出文件名,請驗證該值或使用basename對其進行過濾以獲取文件名。

+0

是的,這裏是'basename()'的最重要原因。 – 2010-02-27 11:34:23

+2

例如,你可以收到'../../../ etc/passwd',這樣,如果沒有basename,你最終會得到'/var/www/uploads/../../../etc/passwd' =='/ etc/passwd' – 2010-02-27 12:05:49

相關問題