2012-06-11 113 views
1

我有一個簡單的網站,允許用戶上傳文件(其中很明顯)。我一直在教自己的PHP/HTML。保護上傳的文件(php和html)

當前該網站有以下特徵: - 當用戶註冊一個文件夾是在他們的名字創建。 - 用戶上傳的所有文件都放在該文件夾中(爲了避免重複出現任何問題,將時間戳添加到名稱中)。 - 上傳文件時,有關該文件的信息存儲在SQL數據庫中。

簡單的東西。

所以,現在我的問題是什麼步驟,我需要採取:

  • 阻止谷歌從存檔上傳的文件。
  • 防止用戶訪問上傳的文件,除非他們已登錄。
  • 防止用戶上傳惡意文件。

注:

我會假設,B,會自動實現答:我可以限制用戶只能上傳與.doc和.docx的文件。這足以抵抗C嗎?我會假設沒有。

+0

要解決A和B,只需在提供上傳文件之前進行身份驗證(基於會話信息)即可。至於C,你首先需要定義「惡意」.... –

+0

好吧。所以我需要「認證」,有人可以指導我看看可能的樣子。 – user187680

+0

你需要閱讀[sessions](http://www.php.net/manual/en/intro.session.php)。但是,那麼你需要使用會話幾乎在動態網站上有用的任何東西! –

回答

1

有一些你想要做的事情,你的問題是相當廣泛的。

  • 對於Google索引,您可以使用/robots.txt。您沒有指定是否也希望將ACL(訪問控制列表)應用於這些文件,因此可能會或可能不夠。通過腳本提供文件可能會起作用,但您必須注意不要使用包含,需要或類似的東西來欺騙執行代碼。您反而想要打開文件,讀取它並通過文件操作基元提供它。

  • 閱讀關於「路徑遍歷」。你想避免這種情況,無論是在上傳和下載(如果你以某種方式提供文件)。

  • 「惡意文件」的定義非常寬泛。對誰是惡意的?例如,如果您擔心自己的身邊被用來分發惡意軟件(您應該),那麼您可以在上面運行防病毒軟件。如果你想確保人們不會傷害服務器,至少要確保他們只能上傳一堆文件類型。檢查擴展和mimetype是一個開始,但不要相信(你可以用png嵌入代碼,如果它通過include()包含,它是有效的)。 然後是XSS的問題,如果用戶可以上傳HTML內容或被解釋爲這樣的東西。確保提供內容處置標題和非HTML內容類型。

這是一個開始,但正如您所說的還有更多。

0

如果一個人設法上載帶有.php擴展名(或導致服務器端腳本/處理的其他擴展名)的文件,您將面臨最大的威脅。文件中的任何代碼都會在服務器上運行,並具有Web服務器的任何權限(因配置而異)。

如果上傳的最終結果只是您希望能夠將文件作爲下載提供服務(而不是讓某人直接在瀏覽器中查看它們),那麼您最好將下載內容存儲在非網頁可訪問的目錄,並通過強制下載的腳本來提供文件,並且不管嘗試執行什麼操作(請參閱http://php.net/header)。

這也使得只有在某人登錄時才允許進行下載變得容易得多,而在此之前,您需要一些魔術來實現這一點。

0

如果您不希望文件可用,則不應該上傳到Web服務器提供的目錄。

我建議你使用X-Sendfile,它是一個指示服務器向用戶發送文件的頭文件。你的PHP腳本被稱爲「獲取某某文件」,將執行你已有的任何身份驗證(我假設你已經擁有了某些內容),然後返回標題。只要Web服務器可以訪問該文件,它就會提供該文件。

看到這個問題:Using X-Sendfile with Apache/PHP