2016-11-28 91 views
0

在手冊中,我可以看到它講述了一些有關安全原因的內容,但我不太明白什麼是有問題的情況。PHP - 爲什麼使用move_uploaded_file而不是重命名?

此功能檢查,以確保由filename指定的文件是 有效的上傳文件(即它是通過PHP的HTTP POST 上傳機制上傳)。如果該文件有效,它將被移動到目的地給出的 文件名。

如果有任何上傳文件完成任何操作可能會將其內容泄露給 用戶,甚至是同一系統上的其他用戶,則此類檢查尤爲重要。

因此它確保它是通過PHP上傳的,但如果它不檢查,會發生什麼?可以透露哪些信息,以及如何?

有人可以解釋這一點嗎?一個例子會很棒。

+0

顯然,文件內容本身和文件名。想象一下php允許上傳到通過http發佈的'/ img'文件夾中。該圖像將可用_before_ php可以進一步處理它,保護它,驗證其內容和名稱,重命名它。 – arkascha

+0

@arkascha但那不是我的問題。你可以驗證所有必要的東西,然後使用'rename'而不是'move_uploaded_file'。 – HtmHell

+0

但是,如果您只需要重命名該文件,該文件就已經位於相同的物理位置。具有所有潛在的安全隱患。注意:這不一定是不安全的。但可能有些人會實施不安全的設置。這就是爲什麼選擇另一種解決方案。順便說一句,爲什麼這很重要? – arkascha

回答

0

這種情況下的安全問題是上傳目錄對公衆可見。

爲避免出現這種情況,您需要配置您的Web服務器(如Apache)以禁止公開目錄。

此外,無論何時通過PHP腳本上傳文件,都需要使用混合字符重命名文件。

例如,您可以將加密的時間戳與實際文件名結合使用。

這似乎是傳統的處理文件上傳。你可以堅持這種方式來安全地處理文件上傳。

編輯:

這個答案編輯按在評論你的問題。

您需要在您的www目錄中的任何一個現有文件中使用rename($existing_old_file_name, $new_file_name)函數對其進行重命名。

move_uploaded_file($tmp_uploaded_file_name, $new_file_name)函數將上傳的文件從tmp目錄移動到您在函數中指定爲第二個參數的目標位置。

+0

但是在使用'move_uploaded_file'時你也會遇到這些問題。我的問題是爲什麼'move_uploaded_file'而不是'rename'? – HtmHell

+0

你需要在你的www目錄中有一個現有的文件,用'rename()'函數重命名它。 'move_uploaded_file()'函數將上傳的文件從tmp目錄移動到您在函數中指定的第二個參數。 – Perumal

+0

不,用'rename',你也可以把一個文件從臨時目錄移動到目標文件夾,如下所示:'rename($ tmp_uploaded_file_name,$ new_file_name)' – HtmHell

0

PHP腳本可能會移動名稱在運行時確定的文件(剛剛上傳的臨時文件的名稱)。該檢查旨在確保寫得不好的腳本不會公開系統文件或包含認證機密的文件。

假設我編寫了一個腳本,允許您將圖像上傳到我的服務器,通過嵌入我提供的一些超級可愛的貓gif來增強它,然後再次下載它。要跟蹤你的工作在其形象,我在請求的URL中嵌入的文件名我的編輯按鈕:

http://example.com/add-kitty.php?img=ato3508.png&add=kitty31.gif 

也許我嵌入在cookie或POST數據的相同信息,錯誤地以爲這使其更加安全。然後,一些中等進取的腳本kiddie來試試這個(或POST/cookie等價物):

http://example.com/add-kitty.php?img=$2Fetc%2Fpasswd&add=kitty31.gif 

看到了嗎?這是路徑/etc/passwd,url編碼。哎呀!你可能只是讓你的/etc/passwd文件可供下載,中間有一點小貓咪噪音。

顯然這不是一個完整的工作任何東西的利用,但我相信你得到的想法:move_uploaded_file函數進行額外的檢查,以保護你免受攻擊,將注入一個意想不到的文件名到您的代碼。

+0

因此,如果我理解正確,上傳時沒有任何安全措施,但它可以幫助您在顯示圖像時防止出現安全漏洞,而不會在第一個位置上傳圖像? (也是這樣,只有當你在那裏做了一個錯誤的編碼)它是如何知道這是一個錯誤的文件名?如果有一個urlencoded斜槓呢? – HtmHell

+0

不,不是。在用戶上傳圖片後,您將繼續發送請求以告訴服務器如何編輯它,然後將其發回給您。這些稍後的請求可以調整,以誘使服務器向您發送您實際上傳的內容。你(@HtmHell)是正確的,正確編寫的代碼可以安全地工作,而不需要這個功能,但是這仍然留下**許多可以受益的代碼。 – alexis

相關問題