2013-02-26 121 views
3

我正在創建一個使用PHP和MySQL數據庫的會員網站,我有辦法讓用戶使用他們的用戶名和密碼登錄。所有漂亮的標準東西。如何去保護文件免受未經授權的下載

我甚至有系統允許註冊用戶下載示例視頻文件。這也很好。

然而,問題是任何能夠找出文件系統的人都可以直接下載這些文件。假設我們的主文件夾包含名爲「視頻」的視頻內容,在「視頻」內部,我們有子文件夾,如「飛機」,「火車」和「汽車」,每個文件夾內都有獨立的文件夾如'飛機','道具'和'間諜'),以及每個子類別的特定視頻。

所以如果有人知道文件系統,他們只需輸入https://www.myvideosite.com/videos/planes/jets/f15.wmv並下載到他們心中的內容,只要他們知道文件名即可。 (正如你所看到的,我有一個安全的連接,它在運行Linux的Apache服務器上。)

這是我想在發現之前插入的一個主要安全漏洞。我研究過.htaccess,但是我的努力往往導致整個'視頻'文件夾無法訪問(我承認,我是所有這些新手!)。

我也讀過關於將我的視頻文件放在網站根文件夾之外,但看起來更令人困惑。

簡而言之,我怎麼可以禁止不是會員的人下載,而是可以通過任何方式發現文件系統是什麼?在我看來,這應該很簡單,但唉,我沒有找到一個可靠的答案。

+1

流從PHP - 見http://stackoverflow.com/questions/1563069/stream-binary-file -from-mysql-to-download-with-php等 – Aerik 2013-02-26 00:10:02

+0

用戶只是在下載這些文件,還是需要讓他們可以在瀏覽器中查看? – 2013-02-26 00:26:36

+0

@Mike Brant這些文件是嚴格下載。儘管現在你提到它,但對話框確實提供了在瀏覽器中打開的選項。 – mileaminute 2013-02-26 00:29:47

回答

4

您可以使用.htaccess文件和「路線」通過PHP腳本的所有請求保護您的視頻文件夾:

RewriteEngine on 
RewriteRule (.*) index.php?file_id=$1 [L] 

而且在index.php

session_start(); 
// get filename from database or somewhere else 
$filename = getFilename($_GET["file_id"]); 

if ($_SESSION["is_logged_in"]) { 
    readfile($filename); 
} 
+0

您可能需要添加驗證以確保某人不會添加類似「../ foo/bar.file」的文件 – Class 2013-02-26 00:14:48

+0

這可以工作+1。使用readfile(),您還可以將您的視頻存儲在webroot下面,而不必擔心.htaccess – 2013-02-26 00:15:20

+0

@Class有趣......您能否詳細說明一下? – mileaminute 2013-02-26 00:22:22

0

做認證這裏有一個答案,如果你有問題.htaccess

好的,所以如果你服務這是public_html,去它的父目錄創建一個目錄名稱「視頻」。 (如果不在public_html中,則可能需要在路徑中添加一些../)。 pathinfo負責驗證問題,並且如果有人試圖偷偷摸摸地找到一個路徑,它將只返回一個文件名。如果您的download.php的名字,這樣的:?

的download.php視頻= fun.mp4

會加載一個名爲從視頻目錄fun.mp4文件。

<?php 
// do your user authentication 
$video_directory = "../videos/"; 
$file = pathinfo($_GET["video"], PATHINFO_BASENAME); 
if($user_is_logged_in) 
{ 
    if(file_exists($file) readfile($video_directory . $file); 
} 

?> 
+0

謝謝你,我現在就看看。告訴我,這是否會阻止人們直接在瀏覽器中輸入路徑和文件名來下載文件? – mileaminute 2013-02-26 03:03:53

0

使用簡單的.htaccess/htpasswd的認證,摘要或基本:

http://www.askapache.com/online-tools/htpasswd-generator/

+0

事實上,我通過My​​SQL數據庫使用身份驗證,而不是htpassword,因爲我曾經說過這樣的研究並不安全。此外,它不允許用戶註銷哪些不是我想要的。我只是想阻止任何人將文件的完整路徑輸入到他們的瀏覽器,這將自動允許他們下載它。 – mileaminute 2013-02-26 18:17:55

相關問題