2009-10-26 74 views
2

在我的網站上,我以一種簡單的方式存儲用戶圖片,例如: 「image/user_1.jpg」。限制訪問我網站上的圖片,除非通過我自己的htmls

我不希望訪問者只能通過嘗試user_ids來查看服務器上的圖像。 (例:www.mydomain.com/images/user_2.jpg,www.mydomain.com/images/user_3.jpg,等...)

到目前爲止,我心目中有三個解決方案:

  1. 我試圖使用.htaccess密碼保護「圖像」文件夾。這有助於我達到某種程度,但某些圖像開始在我的htmls上彈出一個用戶名和密碼請求(雖然令人驚訝的是一些圖像沒有),所以這似乎是一種不可預知的方法。

  2. 我可以開始轉換我的user_id的一些鹽與md5哈希。圖像將被命名爲:/image/user_e4d909c290d0fb1ca068ffaddf22cbd0.jpg。我不喜歡這個解決方案。它使文件系統的方式變得複雜。

  3. 或者我可以使用PHP的readfile()函數或Perl或Python中類似的東西。例如,我可以通過使用md5字符串傳遞密碼來將訪問者驗證爲可以訪問該圖像的登錄用戶。

我傾向於選項3,但以Perl或Python角度(假設它們會比PHP更快)。不過,我希望看到關於此事的其他想法。也許有一個簡單的.htaccess技巧呢?

基本上所有我想確定的是,沒有人可以查看來自我的網站的圖像,除非圖像是從我的網站上託管的htmls內直接調用的。

非常感謝,

Haluk

+0

沒有理由認爲Perl或Python會比PHP更快。 – JAL 2009-10-26 06:30:09

+0

你能說說你的設置是什麼嗎?例如Apache 2.2/Linux。我會傾向於解決方案1,除了使用虛擬主機而不是.htaccess。查看您的文件權限 - 您可能會獲得所有權/權限不合適的彈出窗口。 – heferav 2009-10-26 08:50:52

+0

我在Apache/Linux上。你能提供一些關於我如何使用虛擬主機來達到這個目的的信息嗎? – Haluk 2009-10-27 10:38:21

回答

5

方法1是不可行的,因爲它會要求每個用戶名和密碼,並要求每一個形象。由於緩存問題,您可能會提示某些圖像,而不是其他圖像。

方法#2看起來最吸引我的是處理器密集度最低,但只有通過md5函數傳遞的user_id文件名仍然很容易被猜出。你應該爲md5('我的祕密字符串'。$ user_id)尋求更好的解決方案。

你爲什麼要通過Perl或Python選擇#3? PHP的速度有什麼問題?事實上,如果你以這種方式保護你的圖片,你應該花費額外的時間將它們移出並放到你的webroot上方,這樣它們只能通過你的腳本訪問,它首先檢查用戶是否被認證,然後通過閱讀並輸出它。或者,您可以使用htaccess文件說明deny from all來保護目錄。

另外,您應該通過PHP或via .htaccess去獲得HTTP_REFERER安全性。

祝你好運!

+0

方法1的好處。可能緩存允許我看到圖像。方法2.如果我要使用它,我肯定會使用鹽。方法3:我讀過幾個基準測試,顯示Python和Perl比PHP更快。這就是爲什麼我認爲我可以把負載放在其中一個上。在我選擇最好的基準之前,我肯定會做我自己的基準測試,但這裏是一個基準示例(最佳答案):http://stackoverflow.com/questions/62333/python-vs-php-python-runs-slower – Haluk 2009-10-26 06:36:33

+1

Haluk :速度取決於運行程序的方法。 mod_perl將是最快的,FastCGI應該足夠快,任何語言都可以足夠快,像CGI這樣的語言(像大多數託管服務爲您提供的,獨立於語言)可能足夠快。基準非常依賴於內容。 – 2009-10-26 13:51:26

2

你是正確的選擇考慮#3。使用服務腳本來驗證用戶和readfile()圖像。請務必在提供圖像之前通過header()函數設置正確的Content-Type HTTP標頭。爲了更好的隔離,圖片應該放在網站根目錄的上方,或者使用良好的.htaccess規則來保護 - 肯定有這種方式來保護文件和/或目錄。

+0

謝謝,你是對的,我應該嘗試將我的圖像移出webroot。 – Haluk 2009-10-26 06:39:28

6

您選擇用來確定請求源的任何方法都與用戶瀏覽器發送的HTTP_REFERER信息一樣可靠,但這不是非常可靠。要求認證是保護內容的唯一好方法。

+0

通過身份驗證,如果您的意思是每次調用圖像時都要求輸入用戶名和密碼,我不同意。但是,如果你的意思是「認證會話/登錄」,我同意。我計劃將viewer_id,image_id和一個md5字符串傳遞給我的python腳本。蟒蛇已經知道md5中的鹽了。它會合並salt,image_id,viewer_id並再次提出一個md5。如果傳遞的md5字符串匹配,python將顯示圖像。我甚至可以考慮放棄md5的東西,並提出我自己的小型加密(可能乘以viewer_id和image_id)。 – Haluk 2009-10-26 06:44:04

2

您可以通過htaccess查找「Hotlinking prevention」,我認爲這應該是您需要的保護類型的簡單解決方案。然而,它不是傻瓜證明,真正想要獲得這些圖像的人會通過僞造引薦者找到解決辦法。

http://altlab.com/htaccess_tutorial.html

+0

我不認爲我在找什麼被稱爲「防止盜鏈」。我相信這是爲了避免我的圖像從另一個域被調用。它不會限制訪問者使用以下地址呼叫我的圖像:www.mydomain.com/image/1.jpg。 – Haluk 2009-10-26 06:44:50

+1

您可以刪除規則中允許使用的空白引薦鏈接,該鏈接應該可以工作。 – 2009-10-26 07:23:43

0

正如前面所說的盜鏈保護並不能保護你的文件,只是通過改變其ID。 Plus Refferer可以很容易僞造。

在這種情況下,我會推薦某種身份驗證。您必須創建PHP腳本,該腳本只有在通過COOKIES或SESSION驗證記錄的用戶時纔會提供圖像。 (我不會推薦使用用戶密碼的md5)。

也許你需要一些SQL表來保存訪問權限。

哦,來保護您的圖片,你可以只需將帶有的.htaccess

deny from all 

到圖像文件夾。