2010-10-19 138 views
1

這就是我想要的用戶能夠:PHP文件上傳,安全?

  • 上傳任何文件到服務器(附件)的上傳文件夾
  • 可以下載它之後

所以我有創建此目錄與以下.htaccess

Allow from all 
DirectoryIndex .x 
php_flag engine off 
Options -Indexes 
Options -ExecCGI 
AddType text/plain .html .htm .shtml .php .php3 .php5 .phtml .phtm .pl .py .cgi 
ForceType applicaton/octet-stream 

我的問題是,這是安全的嗎?

+1

可能是值得標註這是「阿帕奇」,因爲.htaccess文件是爲Web服務器,PHP沒有這樣。 – 2010-10-19 23:23:20

+1

那麼什麼是阻止某人上傳.php文件並執行它? – rook 2010-10-20 00:28:07

回答

6

我想說:沒有

如果拒絕所有訪問,並通過該deliveres文件的腳本管理下載它應該是更安全的。 此外,您應該重命名文件,以便在那裏例如沒有人會放置自己的htaccess或其他任何東西。 您可以存儲在數據庫中的原始文件名。

爲什麼:你永遠不會知道未來會發生什麼,有些文件後可以得到可執行文件,別的地方你把一個不安全的腳本,使用戶可以包括那些上傳的文件,等等。

+0

所以,我重命名文件的MD5(「測試」),例如,用腳本提供下載,將上傳outsite WWW和他們的.htaccess「從所有拒絕」? – Simon 2010-10-19 23:35:48

+0

是的,這會更安全。另外,你應該確保服務器上你自己的任何腳本都不能包含這些文件中的一個(這不能通過.htaccess完成,你必須將open_basedir設置爲不包含上傳文件的目錄路徑)文件夾)。如果您將目錄放置在DOCUMENT_ROOT之外,則不需要.htaccess,但目錄無法通過HTTP訪問 – 2010-10-20 02:13:02

0

我同意,這將是更好的通過特殊的腳本下載它們。但是,如果它是不可能的,做兩件事情:

  1. 如果你希望用戶能夠下載文件,你可以添加附件HTTP響應頭 Header set Content-disposition "attachment" 這將迫使瀏覽器下載文件,而不是渲染它。 但是,您必須確保文件不會通過文件包含等其他潛在漏洞進行訪問。
  2. 禁止執行文件上傳目錄中chmod -R a-x
4

我也Dr.Molle同意,你應該重命名文件和動態發送。

但是,而不是通過一個腳本,這會佔用更多的內存比需要送他們,我強烈建議使用mod_xsendfile爲Apache。

隨着mod_xsendfile,而不是通過PHP輸出文件,你可以簡單地發送XSendFile標題:

<?php 
    header('Content-Disposition: attachment;filename=originalname.txt'); 
    header('X-Sendfile: /path/to/file.txt'); 
?> 

這樣,您就可以把所有的文件OUTSIDE網站根目錄,因此完全無法接觸到外面的世界。你根本不用擔心.htaccess。

如果你的主機允許你安裝新的Apache模塊,你需要安裝APXS(它可能會)。如果未安裝,則需要使用apxs重新啓動Apache。根據我的經驗,如果你可以管理它,這是值得的。 XSendFile節省了很多麻煩。