簡體   English   中英

防止直接URL訪問文件

[英]Prevent direct url access to files

背景資料:

我正在建立一個網站,通過訂閱服務提供圖像和視頻內容。 也就是說,只要用戶成功登錄,用戶就應該只能訪問圖像和視頻內容。 (注意:登錄系統使用MySQL DB的組合 - 存儲用戶名和密碼 - 和php創建新的用戶會話/身份驗證等)

問題:

如何阻止用戶(登錄或不登錄)直接訪問圖像和視頻文件? 例如,未登錄的用戶可以直接訪問該文件,如下所示:www.domain.com/testvideo.mp4 - 這將在瀏覽器中呈現視頻內容,供他們觀看或與他人共享。 (注意:我仍然需要能夠通過HTML,CSS,PHP等在現場使用/顯示圖像和視頻文件)

我已經嘗試了幾個成功阻止直接訪問的.htaccess解決方案(包括:RewriteCond / RewriteRule和.htpassword)但是已經阻止了通過HTML,CSS,PHP等在現場使用文件的能力。

我認為這一定是一個非常普遍的問題,如果是這樣,解決問題的最佳方法是什么?

這是一個非常常見的問題,有一個很常見的解決方案。 為了強制訪問控制,您必須在提供文件之前調用PHP腳本並驗證憑據。 然后,如果憑據有效,請提供實際文件。

您可能想要使用readfile東西直接從PHP腳本提供文件。 這將破壞您的服務器性能並破壞客戶端的下載恢復。

幸運的是,當您可以將實際文件服務交還給Web服務器時,有一個解決方案。

其工作原理如下:

  1. Web服務器接收對/file.mp4的請求。
  2. 根據您設置的重寫規則,它會將其指向您的PHP腳本/serve.php
  3. 您的腳本會驗證憑據,例如來自會話或Cookie的內容。
  4. 如果憑據有效,則腳本會發出特制的標頭。 它告訴Web服務器實際提供靜態文件。 如果沒有,您也可以輸出403 HTTP代碼。

示例腳本可以是:

$file = '/tmp/file.mp4'; // it is in your best interest to make this file  inaccessible for a direct download
header('X-Sendfile: ' . $file);
header('Content-Type: ' . contentType($file));
header('Content-Disposition: inline;');

為了使其工作,您必須在Apache上安裝mod_xsendfile( https://tn123.org/mod_xsendfile/ ),這可能已經是您的主機的情況。 您還需要刪除一些行來配置它並設置正確的重寫。

您可以通過發布“mod_xsendfile php”來解決Google上的大量問題,這可能也會有很大幫助。

希望有道理!

只要您的文件是公開可用的,您就無法避免這種情況。

最常見的方法是不直接提供文件,而是通過php提供服務,以便在提供文件之前檢查用戶訪問權限。 然后文件可以駐留在服務器上的任何位置,其中Web服務器用戶(www,apache等)可以訪問但訪問者沒有訪問。

查看關於readfileheader的php手冊中的示例,了解如何通過php提供文件。 你也會在SO上找到很多例子。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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