2010-05-24 103 views
2

在我去指責某人......之前,我需要確認一些事情,我寧願不說。通過.htaccess防止熱鏈接的高效方法

問題:

我們允許用戶上傳圖片,並在我們的網站文字中嵌入它們。在過去,我們允許用戶鏈接到我們的圖片,但由於服務器負載,我們不得不阻止這一點。

當前的「解決方案」:

用來解決我們的「連接過多」的問題,程序員是重命名接收和處理圖像的請求(image_request.php)到image_request2.php文件的方法,與

<?php 
header("HTTP/1.1 500 Internal Server Error") ; 
?> 

顯然,這已經引起了所有圖像與他們的src屬性指向原始image_request.php被打破,也是在這種情況下發出錯誤的代碼替換原來的內容。

建議解決辦法:

我覺得一個更優雅的解決辦法是:

在.htaccess

  1. 如果請求的是image_request.php
  2. 檢查引薦
  3. 如果推薦人不是我們的網站,請發送相應的標題
  4. 如果引用是我們的網站,請繼續image_request.php和處理圖像要求

我想知道的是:

相比於簡單地返回一個500爲每個請求image_request.php :

多少更多如果我們要使用我上面提出的替代解決方案,會產生負載嗎?

有沒有更好的方法來做到這一點?

我們主要關心的是該網站保持運行狀態。我不願意同意打破所有內部鏈接的圖像是解決這個問題的最好的/唯一的方法。我拒絕告訴我們的用戶,由於我們改變了一些東西,他們現在必須手動更改以前上傳的內容中的嵌入代碼。

+1

我假設你使用的是數據庫?在這裏扮演魔鬼的擁護者,爲什麼你不能在存儲的數據中搜索並替換image_request.php的所有實例?你不需要告訴你的用戶任何東西... – Drew 2010-05-24 06:41:47

+1

有效評論,我確實考慮過這個。 (1)我不認爲程序員的「解決方案」應該被執行,我希望他們能夠正確地解決它 (2)我不是100%確定當程序員將代碼從image_request.php複製到image_request2.php,但他們也沒有對文件調用不兼容的更改進行修改。 (3)除了從用戶內容中剝離調皮內容(例如腳本標記)之外,我反對偷偷地「更新」他們的內容,並且不想處理他們可能導致的任何不可預知的問題。 – 2010-05-24 09:27:45

+0

感謝您的回覆。我發現你的任何理由都沒有錯。項目祝你好運! – Drew 2010-05-25 02:12:29

回答

1

使用ModRwrite可能會比運行PHP腳本減少負載。我認爲你的解決方案會更輕。

如果引用程序標題不爲空,請確保您僅在步驟3中阻止訪問。有些瀏覽器和防火牆會完全阻止引用標頭,因此您不想阻止這些標頭。

+0

我很難決定這個問題的最佳答案。接受這一個,因爲它是第一個解決負載差異問題。對這個問題的每個答案都非常有幫助,因此我很難選擇「最佳」。謝謝你們! – 2010-05-25 07:11:30

1

我假設你用圖像的ID存儲圖像路徑在數據庫中,對吧? 然後你查詢數據庫的圖像路徑給它的圖像ID。

我建議你將MemCached安裝到服務器並對用戶請求進行緩存。在PHP中很容易。之後,你會看到服務器負載,並決定是否應該停止這個盜鏈事件。

+0

關於memcached的好主意,不幸的是我是一個人開發團隊,現在沒有時間安裝/進行必要的代碼更改。我希望能夠啓用盜鏈功能並將水印鏈接到圖片上,但我們正在運行一個擁有搖搖晃晃的服務器的骨架團隊,並且只需要一些能夠讓我們的網站顯示我們的圖片的東西,並防止(現在)其他網站與我們盜鏈。 – 2010-05-24 10:17:01

+0

添加了另一個關於防止與mod_rewrite熱鏈接的答案。 – 2010-05-24 11:38:00

1

您增加的負載等於PHP(zilch)中字符串比較的負載。

混淆解決方案甚至無法解決問題,因爲它不會阻止未來的盜鏈行爲發生。如果您確實檢查了引用鏈接頭,請確保所有主流主流瀏覽器都能按照您的期望設置標頭。它是一個可選標題,對於嵌入在HTML文檔中的圖像,行爲可能因瀏覽器而異。

您可能會爲所有請求啓用會話(無論它們是否已通過身份驗證) - 作爲備份計劃,您還可以將會話cookie名稱重命名爲某種模糊內容(編輯:obscurity實際上並不重要,因爲只要cookie是爲你的主機設置的(而且是)),並檢查在image_request.php中設置了該名稱的cookie(沒有cookie集合將表明它是對你的站點的第一個請求)。僅將其用作後備或冗餘檢查。這比檢查引薦來源更糟糕。

如果您是通過markdown或其他方式即時生成IMG HTML,那麼您可以使用私鑰散列策略,並在查詢字符串中附加短暫的過期時間。完全密封,但它似乎在你正在做的事情頂部。

而且,沒有「適當的標題」爲說謊對一個關於資源的可用性客戶;)只要發送一個404

+1

如果資源可用,但服務器仍拒絕提供服務,則應發送403(禁止)。 – Tgr 2010-05-24 11:47:30

+0

你是對的,謝謝。 – Aaron 2010-05-24 11:56:28

2

好吧,那麼你可以使用Apache的mod_rewrite的能力,以防止盜鏈:

http://www.cyberciti.biz/faq/apache-mod_rewrite-hot-linking-images-leeching-howto/

+0

這是一個很好的鏈接,謝謝。我已將它發送給正在制定正確解決方案的開發人員。 – 2010-05-25 07:45:28

+0

歡迎。我回到你家裏,至少趕上我的建議;)) – 2010-05-25 08:23:16

+0

現在鏈接似乎轉到垃圾郵件網站。 – 2013-07-11 16:26:18