對於網站盜鏈行為,是非常不道德的。我們也不能只是譴責那些沒素質的傢伙,最終還得在技術上防止網站資源被別人盜用。
要實現防盜鏈,我們就得在IIS處理類似圖片檔案的資源時攔上一刀,檢查它的通行證是否合法,不合法的請求我們就要堅決的斃掉。
我們先來看一張有關IIS處理請求的圖
這張圖片說名了一個ASP.NET 處理管道的流程。首先一個請求過來以後,會先被IIS(WinXP中的進程叫做aspnet_wp.exe,Win2003中叫做w3wp.exe),如果IIS發現請求的時asp頁面,那麼就交給asp.dll進行處理;如果請求的是一個aspx頁面,那麼就交給aspnet_isapi(IIS擴充)進行處理,如果是HTML 頁面、文字檔、JPEG 和 GIF 映像,那麼IIS進程就自己進行處理。
我們看到在ASP.NET處理管道中要經曆一個HttpModule和HttpHandler。我們要用到的就是HttpHandler。也就說我們要自己實現一個HttpHandler來處理圖片啊,壓縮包什麼的請求。
實現起來也不是很難,只要繼承並實現IHttpHandler介面就可以了。
其中 IsReusable 說明是否可以被緩衝,而ProcessRequest方法就是如何進行處理的代碼。
1. 我們可以通過判斷context.Request.UrlReferrer來分辯請求是否合法,然後通過context.Response.WriteFile(context.Request.PhysicalPath);來輸出檔案。
2. 還要通過配置config檔案來讓asp.net知道有這個httphandler,格式類似於下面這個。
• verb可以是"GET"或"POST",表示對GET或POST的請求進行處理。"*"表示對所有請求進行處理,這裡是對GET請求進行處理。
• path指明對相應的檔案進行處理,"*.aspx"表示對發給所有ASPX頁面的請求進行處理。
• type屬性中,逗號前的字串指明HttpHandler的實作類別的類名,後面的字串指明Dll檔案的名稱。
3. 最後還要配置IIS,將要處理的檔案類型映射到aspnet_isapi.exe
這樣當有對gif圖片的請求是就會通過我們的HttpHandler,讓我們可以斬斷盜鏈“黑手”。
但是如何你要防止盜鏈的檔案比較多,有gif,jpg,rar,zip,txt,bmp,等等時,我們還要在web.config中進行配置嗎?如果Handler的變更要修改web.config,會造成網站的重啟。是否有好的解決方案呢,大家可以去想想,找找。我下次在接著說:)
參考資源:
ugoer
msdn
本來想寫來自哪裡的,可是哪個圖片是防止盜連的(汗....)就不寫了,順便ps dudu一下,以前上傳圖片都可以很大的,現在限制成了200k, 真不知道為什嗎?