2010-10-27 93 views
1

我有一個公共網站,用戶可以選擇上傳PDF文件並在需要時閱讀該pdf。使用php複製命令上傳文件

我使用PHP命令

$error = copy($tmp_name, $fpath); 

保存文件到服務器....

我現在面臨的問題是

  1. 任何一個可以上傳任何類型的文件(.exe ,蝙蝠)的文件,但我只需要pdf?

  2. 當試圖瀏覽PDF文件時,如果有人將其(.exe,.bat)文件擴展名更改爲.pdf如何降低該腳本在服務器上執行的風險?

我正在努力解決從過去的幾天這個問題,但沒有成功......

感謝

+0

我有PHP版本5.3.2,但是當我使用這個命令$ FINFO = finfo_open(FILEINFO_MIME_TYPE)...我得到錯誤未定義功能...我讀了PHP文件這個擴展將提供默認情況下,如果不從哪裏我可以下載這... – air 2010-10-27 13:29:01

回答

2

不要使用copy(),使用move_uploaded_file()來獲取上傳的文件。使用copy()受到如此嚴重的安全漏洞影響。

如何降低該腳本在服務器上執行的風險?

這很簡單:只要不把它放在任何地方它的執行:)嚴重的是,你可以存儲在服務器上最邪惡的病毒 - 只要他們是在一個目錄,使他們能夠」運行,你沒有問題。

真正的問題是當人們下載文件時會發生什麼。您可以使用其他答案中概述的fileinfo來確定它是否爲PDF。除此之外的任何事情 - 例如檢查PDF文件中的惡意攻擊,其中有一些 - 您必須安裝服務器端的病毒掃描程序。

除此之外,這將是用戶的責任有一個病毒掃描程序的運行。這裏沒有100%的安全。總的安全性可能來自打開和使用本機PDF庫重新保存每個PDF文檔,但我不知道是否有任何PHP庫,可以做到這一點很好。

0

使用fileinfo得到MIME類型(+任何你需要的其他人),以檢查是否這是一個pdf。

編輯:一個更簡單的替代方案將使用mine_content_type(),但那從PHP5以來已棄用。

PS:對PDF格式的MIME類型應該是application/pdf

0

1)爲了解決這個問題,你需要在你的最終邏輯來檢查文件,例如使用Fileinfo模塊來確定文件的MIME類型。另外,請確保始終保存帶有.pdf文件擴展名的文件,並阻止所有擴展名錯誤的文件(以防止用戶下載任何可執行文件)。但這不會100%安全。如果您想完全保護自己免受病毒攻擊,則需要在服務器上安裝防病毒程序並檢查所有上傳的文件。

2)這很容易。只需在您的Web服務器配置中禁用您的上傳文件夾的所有腳本執行。這取決於Web服務器而有所不同。


哦,如果你的Web服務器允許在目錄中的配置文件,如Apache的.htaccess,確保文件名不.htaccess或任何其他神奇的文件名..

0

您可以使用類似tool.pdf.Validate的工具驗證PDF,但對於許多不同版本的PDF,您將面臨漏報風險,特別是對於較新的軟件包。

0

上有文件上傳的another question主題由bobince一個very good write-up。他的回答在我以前沒有考慮過的問題上帶來了一些問題。這真的值得一讀。

而且正如Pekka所說的,不要僅僅使用copy(),使用move_uploaded_file()函數來存儲從tmp目錄中移動上傳的文件。