2012-02-05 59 views
1

我用PHP和MYSQL製作了一個數據庫系統。它有很多敏感信息,所以我試圖把最好的安全性。試圖保護多媒體文件

我對視頻和音頻文件有疑問。我只想要登錄並且實際上有權下載文件以便能夠下載它們的用戶,而不是任何只指向媒體文件所在的文件夾的用戶。我怎樣才能做到這一點?!謝謝!

+0

你存儲數據庫或文件系統上的文件? – Vyktor 2012-02-05 18:43:45

回答

0

通過一個php包裝器(即<img src="files/file.php?id=oj348jfoj" />)調用你的文件,並在你的file.php文件中輸出帶有圖像頭的文件,如果用戶有權查看文件的話。在你的表中,你有與你的oj348jfoj標記對應的真實圖像URI,這就是你file.php加載並輸出爲請求者的圖像。通過這種方式,服務器文件的真實URI保持隱藏狀態,您可以檢查每個圖像加載的訪問權限。

+0

我會在哪裏放置文件?如果他們知道他們在哪個文件夾,他們仍然可以通過url訪問? – xionhack 2012-02-05 19:23:11

+0

在一個你通過htaccess限制外部訪問的文件夾中 - 此外,這已經需要有人猜測正確的文件夾和文件名,因爲你沒有公開任何地方 – kontur 2012-02-05 19:45:02

-2

所以。這些文件必須在服務器上,這很明顯。這裏有一個建議:將它們隱藏在某個地方。然後,當用戶點擊下載時,複製將其內容複製到臨時位置並保存到10到30分鐘的MySQL表中(如果HUGE文件可能更多)。然後用戶可以從該鏈接下載。最後,每10-30分鐘(等量)運行一次cronjob,刪除過期的文件。

這不是100%的安全性,因爲一個未登錄的用戶也可以下載,但只有當登錄的用戶共享URL時,他們纔可以直接發送給他們。

+0

誰downvoted:你能解釋原因嗎? – axiomer 2012-02-05 18:46:50

+0

這是不安全的,它過於複雜。您可以擁有無​​法直接訪問的文件,而不是創建臨時公共位置。 – 2012-02-05 19:44:08

+0

可能很複雜,但這是安全的,因爲文件名可能是隨機的,因此,未登錄將要麼嘗試(這是不可能的),要麼已登錄的必須共享URL,但它是一樣的如果他們共享文件。您的觀點對安全無效。 – axiomer 2012-02-05 19:48:14

0

您需要使用PHP流式傳輸文件。使用查詢字符串傳遞文件的名稱,然後將其寫入頁面。在流式傳輸文件之前,您可以檢查權限。

僞代碼:

header("Content-Disposition: atachment; filename=$filename"); 
header("Content-Type: application/octet-stream"); 
header("Content-Length: ".filesize("$path/$filename")); 
header("Pragma: no-cache"); 
header("Expires: 0"); 
$fp=fopen("$path/$filename","r"); 
print fread($fp,filesize("$path/$filename")); 
fclose($fp); 
exit(); 
+0

我會在哪裏放置文件?如果他們知道他們在哪個文件夾,他們仍然可以通過url訪問? – xionhack 2012-02-05 19:22:57

+0

使用包含「全部拒絕」的.htaccess文件拒絕對它們的訪問。這可以防止通過Apache的直接請求,但仍然允許PHP讀取(並輸出)它們。或者更好的解決方案是將它們放在你的apache文檔根目錄之上,這樣很明顯它們不能從Apache訪問。 – Mark 2012-02-05 19:39:29

+0

我建議你把它們放在你的文檔根目錄下,這樣它們就不能用任何url訪問。 – 2012-02-05 19:41:51