2012-10-05 32 views
0

我正在製作一個網站,允許用戶上傳任何類型的文件。所有文件都存儲在'文件/'文件夾中。我希望用戶能夠查看並下載該文件夾中的任何文件,但不能執行它們。我們都知道,某些文件(如JPG文件)很容易:瀏覽器具有內置系統來顯示它們。允許用戶查看或下載文件,但不能執行它們

其他文件(如PDF文件)無法直接顯示,因此瀏覽器會提示用戶下載屏幕。這也很好。

但是,其他文件(如PHP文件)會造成問題。當我打開一個這樣的文件時,如果我不小心,它會被執行。例如,如果該文件包含

<?php echo 'ok'; ?> 

然後當我去「文件/ myphpfile.php」,我所看到的僅僅是「OK」,並將該文件的不是內容。這不僅會發生在PHP文件中,我猜想,也會發生在我的服務器可以執行的任何其他文件類型(例如ASP文件,我想)。

我需要的是防止用戶執行這些文件,以便當他們進入'files/myphpfile.php'時,他們要麼看到文件內容,要麼瀏覽器提示他們下載屏幕。理想情況下,這將是一個通用的解決方案,不需要我構建服務器可執行的每種文件類型的列表。

對我來說,最合理的方法是將文件權限設置爲644,以便用戶只能讀取文件。但是這樣做後,PHP文件不斷執行。

+0

您可以隨時將擴展名更改爲'filename.php.txt'? – andrewsi

+0

執行你的意思是被PHP解析? – PeeHaa

+0

@PeeHaa通過執行我的意思是如果文件有<?php echo'ok'; ?>,然後當我打開它時,我看到'ok'。 – Sophivorus

回答

2

下載:

header('Content-Type: text/plain'); 
header('Content-Disposition: attachment; filename=somefile.php'); 
header('Pragma: no-cache'); 
readfile('/path/to/somefile.php'); 

要進行顯示:

echo htmlspecialchars(file_get_contents('/path/to/somefile.php')); 

UPDATE

當我打開一個這樣的文件,如果我不小心,它被執行

這就是爲什麼你沒有直接鏈接到文件。即這些文件不應該上傳到文檔根目錄中的某個位置。如果文件上傳到文檔根目錄之外的目錄,則用戶無法直接通過URL訪問它,例如:http://example.com/files/somefile.php

會發生這種情況不僅與PHP文件,我想,也與我的服務器可以執行任何其他文件類型(例如ASP文件,我想)。

您是唯一一個可以分辨哪些文件可能有危險的人。我們無法知道您是否有一些服務器也可以提供(並解析)asp文件,也沒有其他可能存在的危險文件。

我需要的是防止用戶執行這些文件,這樣當他們進入'files/myphpfile.php'時,他們要麼看到文件內容,要麼瀏覽器提示他們下載屏幕。

查看我上面提供的解決方案。

對我來說,最合理的方法是將文件權限設置爲644,以便用戶只能讀取文件。但是這樣做後,PHP文件不斷執行。

這是因爲PHP文件沒有得到執行。它們只被解析(即被網絡服務器讀取)。

所以基本上你需要找出哪些是可能的危險文件類型(也考慮可能被PHP解析的其他文件,例如.phtml或什麼不是)。用戶不應該通過HTTP請求來調用可執行文件。因爲當我做http://example.com/run-virus.exe它永遠不會在服務器上執行,但它只會請求文件。

+0

謝謝,但有沒有更通用的解決方案,可能有權限?因爲採用這種方法,我將需要很多條件:如果它是一個php文件,那麼做到這一點,如果它是一個JavaScript文件,那麼做,如果它是一個圖像,做其他事情,等等。 – Sophivorus

+0

JavaScript文件或圖像在服務器端執行? – PeeHaa

+0

我的錯誤。但我的意思是,任何可執行文件(不僅僅是PHP)都需要與其他的不同。還是隻有幾種我應該擔心的文件類型? – Sophivorus

0

我解決了這個問題,通過腳本顯示文件,而不是直接從他們的真實位置。該劇本摘自an answer to a previous question of mine

$fileinfo = finfo_open(FILEINFO_MIME_TYPE); 

header('Content-Type: ' . finfo_file($fileinfo, 'files/' . $filename)); 

finfo_close($fileinfo); 

readfile('files/' . $filename); 

所以,現在想看看裏面的文件/ myfile.php「用戶必須去「開/ myfile.php」,和上面的腳本會提示他們下載屏幕,或在瀏覽器中顯示文件,如果瀏覽器能夠這樣做的話。

相關問題