2012-08-12 106 views
1

無論我看看PHP函數renamemove_uploaded_file之間的區別,它總是說有一些安全特性。PHP move_uploaded_file,它提供了什麼安全

我的問題是:

  1. 那些是什麼安全功能,如果我不使用它發生什麼?
  2. 如果我不能使用它(我做了一個上傳但不是通過POST),所以我必須使用rename函數,我需要採取什麼安全措施?

謝謝。

編輯
@Pekka從我問來闡述我打算如何上傳文件。 我將通過Ajax上傳文件,並且我有一些用於上傳多個文件的隊列功能。因此,我正在使用php://input流。

如果我理解Pekka正確答案,我沒有什麼可擔心的,因爲我將文件作爲流獲取,並且我不復制任何臨時文件。 如果我錯了,請糾正我。

+0

你可以擴展你不能使用它的情況嗎?如果你沒有進行POST上傳,你不能使用PHP的內置'$ _FILES'數組,並且不會有臨時文件來重命名,會不會有? – 2012-08-12 16:27:34

回答

2

這個背景是一個古老的,非常糟糕的漏洞(在21世紀初),您不用上傳實際文件,而是用本地文件路徑覆蓋tmp_file路徑,從而導致本地文件視爲上傳而不是實際上傳的文件。 (有沒有$_FILES陣列當時的情況。)

因此,例如,上傳頭像時,腳本會(配置文件../../super_secret/config.php.htpasswd說,)copy()您指定的系統文件,公共場所,並嘗試將其作爲頭像圖像顯示在<img>標記中。

奇怪的是,我無法找到關於此漏洞的任何具體信息(我已經在過去幾年中搜索過很多次),但是我知道它存在是因爲我自己測試了它。任何鏈接都歡迎。

至於要採取何種安全措施,如評論中所述,我認爲您需要更詳細地解釋您打算使用哪種備選文件上傳方式。

+0

感謝您的詳細解釋。我詳細闡述了你的問題,請讓我知道我的結論是否正確,謝謝。 如果我有信譽,我會+1的答案。 – nheimann1 2012-08-12 17:21:00

+0

接受你的回答後,我得到了足夠的聲望+1你的回答 – nheimann1 2012-08-12 17:23:45

+1

@goBeepit heh,很好的巧合:)是的,如果你直接使用'php:// input'並且不依賴於用戶輸入的文件名,你在這方面應該沒有什麼可擔心的。 – 2012-08-12 17:29:16

相關問題