簡體   English   中英

保護文件不被直接訪問

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM