2012-06-29 41 views
0

我有一個視頻存儲在我的服務器上。阻止用戶找到鏈接

我不希望人們在找到鏈接(查看源代碼)後能夠鏈接到該視頻。

處理這種情況的最佳方法是什麼?

感謝, 丹尼

+0

簡單:不要將它存儲在你的服務器上併發布它! – Christoph

+0

我會說:你不應該阻止用戶這樣做。但是__如果你真的需要,那麼技術可能性就很有趣。無論如何,我相信沒有100%可靠的方法。或者可能是這樣,但代價很高,在大多數情況下會讓用戶生氣。 – Arsen7

回答

1

另一種方法是加密鏈接弄好了,如果你不想(或不能)使用身份驗證,究竟是什麼在他的回答提出由約翰·做。如果你的鏈接每小時都會改變,分享將會很困難。

如果您使用類似當前小時(和天)的md5哈希值,則在大約兩個小時後,任何發現的鏈接都將無法使用。爲什麼兩個?因爲您應該在12:59:59生成鏈接時處理這種情況,所以當客戶端的瀏覽器嘗試訪問資源時,鏈接無效。爲防止出現這種情況,您應該檢查之前的小時是否與網址匹配,如果當前小時沒有。

如果在URL中使用散列太困難,您可能需要參數 - 並使用與John在其答案中顯示的代碼類似的代碼。

所以,場景看起來像這樣

客戶端獲取的頁面。您的服務器需要將該鏈接指向視頻。它檢查它的2012-06-29 14:55:30,需要像下面的2012-06-29T14:5_:__計算散列該日期,並用這樣的URL出現:href="/videos/736453273dh367d52gs82/movie.mpg"

客戶端的瀏覽器下載的資源,讓您的服務器接收與這些奇怪的數字,URL的請求內。你的服務器檢查時間,發現它是2012-06-29 14:55:31。清除最後三位數字(因爲我認爲一個小時可能太多),並從2012-06-29T14:5_:__創建一個散列。它是否與客戶提供的URL相匹配?是。然後提供該文件。

如果URL不匹配,則服務器將時間減少1,因此它會嘗試編碼2012-06-29T14:4_:__ - 如果這也不匹配,則返回錯誤代碼。

因此,您只有約20分鐘的鏈接。您可以決定什麼時間範圍適合您的需求。但請記住 - 任何獲得該鏈接的人都可以在此期間使用它。另外要小心你產生的散列 - 如果那只是時間,你可能會冒這個方案是可以猜測的。使用一些隨機,但請記住它必須是相同的頁面,其中生成的URL和檢查的頁面的URL。

+0

阻止某人使用curl獲取所有參數,會話,cookie,散列,設置useragent和referrer的操作。需要下載... zip –

+0

如果鏈接僅在某個時間範圍內有效,則不需要任何會話參數。此方法只需要服務器上的_time_。但是,如果我下載資源並自行發佈......沒有人能阻止我:)我也認爲在大多數情況下,這些防止共享技術是不好的。我的意思是不好的可用性。 – Arsen7

4

不要將其存儲在Web根。將它保持在Web根目錄之外並通過PHP文件引用它。該文件將對用戶進行身份驗證,以驗證您希望他們能夠查看視頻並讓他們看到視頻。否則,它會阻止視頻加載或加載錯誤消息。

HTML:

<a href="video.php">Watch the video</a> 

樣品PHP(video.php):

<?php 
    if (!isset($_SESSION['authenticated'])) 
    { 
     exit; 
    } 
    $file = '/path/to/file/outside/www/secret.avi'; 

    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename=' . basename($file)); 
    header('Content-Transfer-Encoding: binary'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
    header('Pragma: public'); 
    header('Content-Length: ' . filesize($file)); 
    ob_clean(); 
    flush(); 
    readfile($file); 
    exit; 
?> 
+0

hm,所以用戶必須進行身份驗證...您如何阻止用戶共享鏈接+他的憑據? – Christoph

+0

你可以嘗試做IP檢查等,但底線是沒有100%的萬無一失的方法來阻止某人查看你不想訪問的視頻。如果它在互聯網上,那麼如果他們願意努力去獲得它,那麼最終它是可用的。 –

+2

上面的代碼也不允許超過2GB的文件或處理漸進式加載。正確的答案是:'問:阻止用戶找到鏈接''答:你不能' –

2

你可能沒有正確表述你的問題,但我認爲你在尋找什麼最熱門-linking預防,添加到您的.htaccess

RewriteEngine on 
RewriteCond %{HTTP_REFERER} !^$ 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?yourdomain.com/.*$ [NC] 
RewriteRule \.(avi|mp4)$ - [F] 

更有效的方式是使用一次性的聯繫:

  • 請求託管視頻的頁面。
  • 生成一個隨機字符串,並將其存儲在一個會話並將它添加到鏈接`video.php?ID = 10 &令牌= 9283y540983y45
  • 使用約翰孔德的方法來限制直接訪問,並允許通過PHP文件訪問。
  • 在PHP文件中,通過與會話中的字符串進行比較來檢查URL中的令牌是否正確。
+0

這是行不通的,因爲我可以將該標題添加到'wget'並下載文件沒有問題。 – Arsen7

+0

@ Arsen7,你甚至不需要'wget'。不管你做什麼,如果你不使用一次性鏈接,你的鏈接將被共享,並將以你不想要的方式被使用。 – Adi