2011-07-14 10 views
1

我有一個文件,叫它secret.pdf,我提供下載。但是,我想阻止它有一個可以複製/粘貼或鍵入的網址,例如www.website.com/pdf/secret.pdf(不要捕獲文件!)。使用joomla(甚至只是PHP),你會如何混淆PDF文件名?

例如,用戶A點擊鏈接,並獲得kgsjgldsg.pdf。用戶B點擊相同的鏈接,但獲取asadsfsefaw.pdf。關鍵是,一個隨機文件名用於引用同一個文件,secret.pdf。

我用google搜索php文件混淆器,和joomla文件名混淆器,並沒有運氣。任何想法或指針在正確的方向將不勝感激。

回答

3

您可以根據時間添加一個GET變量,即有效期爲1分鐘(應該足夠)。

所以,你的請求將被/pdf/getPDF.php?key=xxxxxxxxx

key一個鹽醃哈希基於服務器的當前時間,比如5最接近的數整除(當它是17:17你會使用17:15,等等)。

然後在您的getPDF.php文件中生成'當前'散列,如果它是相同的,則將您的PDF流式傳輸。

這不會阻止人們使用該鏈接,但該鏈接僅在5分鐘內有效。

附錄:你應該確保在PDF不能從外部訪問,但對您的PDF串流的PHP文件只可讀(例如,超出你的/var/www或等效目錄)

+0

聰明,我喜歡它。 – jason

+0

仍然留下一個窗口打開。更好的做法是將生成的密鑰值記錄到數據庫中,並在調用下載腳本時使密鑰無效或刪除。這樣可以儘可能長時間保持「開放」,並且一旦下載開始就會自動關閉。 –

+0

完全同意,但我不知道這是否是一個讓窗口打開的大問題。這不是一個安全問題,因爲pdf可以被共享:我不認爲你在這裏是一個真正的問題,但理論上你是對的:D – Nanne

3

另一種是存儲PDF文件您的主機帳戶上的public_html網頁文件夾提升了1級。然後,您可以使用完整路徑將文件作爲下載文件發送給用戶。這樣,任何人都無法訪問該文件,因爲它在您的網站上不可用。只有您網站上的代碼知道文件的位置。我這樣做的一些組件,請參閱下面的代碼有關Joomla:

$file = '/home/domain/files/secret.pdf' 
    $filesize = filesize(file); 
    JResponse::setHeader('Content-Type', 'application/pdf'); 
    JResponse::setHeader('Content-Transfer-Encoding', 'Binary'); 
    JResponse::setHeader('Content-Disposition', 'attachment; filename="'.$file.'"'); 
    JResponse::setHeader('Content-Length', $filesize); 
    echo JFile::read($file);