[英]Protect file from direct access
我有一個保存文件的文件夾。 可以從網頁訪問這些文件。 假設目錄類似於manual/fileName.pdf
。
我還有一個頁面顯示manual/
文件夾中存儲的文件的列表,並且此頁面受用戶會話的保護。 因此,您必須先登錄才能訪問該頁面。
我讀到通過在文件夾中放置.htaccess
文件,可以防止用戶直接訪問文件。 但是現在即使從該列表頁面我也無法訪問它們。
這是我在.htaccess
寫的內容:
RewriteEngine on
RewriteRule .documentation.php
這是我的文件列表腳本:
if ($handle = opendir('manual')) {
while (false !== ($entry = readdir($handle))) {
if ($entry != "." && $entry != "..") {
if (!preg_match('/.php/', $entry) && !preg_match('/.htaccess/', $entry)) //prevent some file to be shown
{echo "<a href='manual/$entry' target='_blank'>$entry</a><hr>";}
}
}
closedir($handle);
}
任何想法如何訪問文件?
通常,從文檔根目錄提供受保護的文件不是一個好主意。 特別是當用戶需要登錄才能查看/訪問它們時。 當您將服務委托給Web服務器時,將失去以編程方式檢查用戶是否已登錄的功能,因為Apache Web服務器無法知道用戶是否在您的PHP應用程序中通過了身份驗證。 用戶知道文件URL后,就可以訪問該文件而無需登錄系統。
有一種解決方法,我會幫助您解決。 但我強烈建議您將文件放置在webroot之外,並開發一個腳本以在訪問時將其交付。 這樣,您可以在提供文件時檢查經過身份驗證和授權的會話。
但是,如果您堅持采用這種方式,則有一種解決方法。 讓我們列出一個示例目錄結構:
/path/to/web/document/root
├── manual
│ └── .htaccess
│ └── file1.pdf # protected
│ └── file2.pdf # protected
│ └── file3.epub # protected
├── documentation.php
├── listing.php # protected
└── .htaccess
您希望對manual/
目錄中的文件進行保護,並且僅在用戶登錄后才能訪問。 因此,您將以下指令放在您的manual/.htaccess
文件中:
RewriteEngine on
RewriteRule ^ /documentation.php [R]
# Your own rewrite rule has a syntax error and
# causes a 500 internal error
這會將所有請求重定向到父目錄中的documentation.php
文件。 如果不需要外部重定向,請刪除R
標志。
如您所說,現在的問題是,對manual/
的文件的任何請求都被重定向到文檔文件。
解決方法是檢查HTTP_REFERER
標頭,並確保請求來自listing.php
文件。
RewriteEngine on
# Feel free to change example.com with your own domain
RewriteCond %{HTTP_REFERER} !^http://www.example.com/listing.php$
RewriteRule ^ /documentation.php [R]
這樣,對manual/file2.pdf
任何直接請求manual/file2.pdf
將導致重定向到documentation.php
,但是如果用戶單擊listing.php
的鏈接,則她可以毫無問題地訪問該文件。
如果需要使引用條件更通用,請參閱本文:
通過.htaccess查看引薦來源
請注意,用戶可以輕松地欺騙 HTTP_REFERER
標頭 ,從而無需登錄即可訪問文件。 實現此目的的唯一真正的防彈方法是我在本文開頭提到的內容。
您可能還希望使用基本的http auth保護manual/
目錄。 但是通過這種方式,用戶需要輸入另一個用戶名/密碼組合才能訪問該文件夾。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.