2011-04-20 85 views
1

從我以前的討論中,我拿走了文件如果放在根目錄下是安全的事實。我與爲我處理這個問題的人交談過,他說如果我們阻止公衆訪問,那麼上傳內容的用戶將無法下載或查看他們的文件。給你一個我想要做的例子:在根目錄下存儲文件

如果我,網站的成員上傳到我的帳戶一個word文件,那麼我應該能夠回來並下載它。但是因爲該文件夾阻止訪問,文件如何被下載?

+1

如果你的意思是上面的webroot,那麼他們是「安全」的,因爲它們不能被最終用戶解決。 – 2011-04-20 12:05:41

回答

2

通常情況下,您想要下載的文件應位於文檔根目錄或其中更深的位置。但是,如果您只想在某些時間下載文件(例如,您想首先檢查用戶憑證,或者計算數據庫中的下載次數),則可以編寫下載腳本。最簡單的形式會是這樣的:

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

注意有使用特殊的Apache模塊稱爲xsendfile更好的方法。就這樣,你可以做這樣的事情:

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

Apache會看到第二個頭部,剝離它,併發送file.txt的內容。好的是你的資源密集型PHP腳本已經停止了,你不會遇到任何類型的PHP時間或內存限制。

+0

+1對於良好和完整的文章(使用mod_xsendfile確實是apache的一個很好的解決方案)。然而,您應該注意,第一種方法可能無法在託管open_basedir限制時生效...... – wimvds 2011-04-20 12:11:32

+1

@wimvds:在幾乎所有與open_basedir限制共享的主機上,受限制的目錄實際上是公共文檔根目錄之上的一個目錄。在這種情況下,它通常會工作(因爲用戶無法將文件上傳到open_basedir指定的目錄之外的任何地方)。在AAA的情況下,它幾乎可以保證工作。他的[上傳腳本是一個PHP腳本](http://stackoverflow.com/questions/5670142/what-are-some-security-holes-a-website-is-exposed-through-document-upload)。任何PHP都可以編寫一個文件,'readfile'將能夠讀取它,因爲它們都使用相同的open_basedir。 – 2011-04-20 12:24:40

+0

我如何能夠看到該文件夾​​中是否有文件,我現在已經安裝了它,但是我無法在根目錄下看到該文件夾​​。我錯過了什麼嗎? – AAA 2011-04-20 13:08:44

1

你想要下載的文件應該存儲在根目錄或「之後」。通常你不希望別人直接訪問的文件應該存儲在「根目錄下」。這是因爲如果你需要這些文件只是包括在內,你可以很容易地回到根目錄並獲得他們的include()require(),而他們被用戶隱藏,因爲你的地址將顯示爲www.site.com/index.php

必須公開並需要公共訪問的文件(例如:下載)不能存儲在「根目錄下」。

+0

請elaborte,你是什麼意思在根或以後?我是新的請解釋。謝謝 – AAA 2011-04-20 11:59:34

+0

或鏈接到一個符號鏈接,然後告訴Apache [遵循sym鏈接](http://www.maxi-pedia.com/FollowSymLinks) – Rudie 2011-04-20 11:59:34

+1

@AAA更新... – Shoe 2011-04-20 12:00:37

1

您可以直接從PHP腳本直接傳遞文件給用戶。你需要fpassthru函數。但是這個解決方案並不完美並導致問題。我最好是讓你可以下載的文件放在公開訪問的目錄(文檔根目錄或子目錄中的某處)。或者你可以從子域服務他們(甚至更好)。

相關問題