ASP.NET 防盜鏈的實現[HttpHandler]

本文轉載:http://www.cnblogs.com/eflylab/archive/2008/06/16/1223373.htmlhtml

有時咱們須要防止其餘網站直接引用咱們系統中的圖片,或下載文件連接。須要禁止盜鏈!在ASP.NET中能夠方便的實現該功能!
作一個簡單的盜鏈圖片的示例,以下。新創建一個WebApplcation。新創建一個images文件夾,裏面二張jpg圖片,一張logo.jpg正常圖片,一張用於提示非法盜鏈的圖片Error.jpg圖片。
頁面default.aspx頁面很簡單。就一個圖片以下web

< form  id ="form1"  runat ="server" >
    
< div >
    
< img  src ="images/logo.jpg"   />
    
</ div >
    
</ form >

這裏使用HttpHandler來處理盜鏈問題
新創建一個 通常處理程序 Handler1.ashx.代碼及註釋以下api

public   void  ProcessRequest(HttpContext context)
        
{
            
//判斷是不是本地網站引用圖片,若是是則返回正確的圖片
            if (context.Request.UrlReferrer.Host == "localhost")
            
{
                
//設置客戶端緩衝時間過時時間爲0,即當即過時
                context.Response.Expires = 0;
                
//清空服務器端爲此會話開啓的輸出緩存
                context.Response.Clear();
                
//設置輸出文件類型
                context.Response.ContentType = "image/jpg";
                
//將請求文件寫入到輸出緩存中
                context.Response.WriteFile(context.Request.PhysicalPath);
                
//將輸出緩存中的信息傳送到客戶端
                context.Response.End();
            }

            
//若是不是本地引用,則是盜鏈本站圖片
            else
            
{
                
//設置客戶端緩衝時間過時時間爲0,即當即過時
                context.Response.Expires = 0;
                
//清空服務器端爲此會話開啓的輸出緩存
                context.Response.Clear();
                
//設置輸出文件類型
                context.Response.ContentType = "image/jpg";
                
//將請求文件寫入到輸出緩存中
                context.Response.WriteFile(context.Request.PhysicalApplicationPath + "images/error.jpg");
                
//將輸出緩存中的信息傳送到客戶端
                context.Response.End();
            }

        }

        
// 該屬性表示HTTP請求是否可使用當前處理
         public   bool  IsReusable
        
{
            
get
            
{
                
return true;
            }

        }

該文件用於接管HTTP請求JPG格式的圖片。若是是從主機localhost訪問的,則容許。不然顯示錯誤的圖片!
到這裏該文件尚未效果,須要在Web.config文件進行配置HttpHandler節點 以下緩存

< httpHandlers >
        
< add  verb ="*"  path =".jpg"  type ="MyNamespace.Handler,MyNamespace" />
      
</ httpHandlers >

來測試下 啓動

圖片正常顯示。若是將訪問地址改成 http://127.0.0.1:2136/Default.aspx 效果以下
 

但此時將該項目發佈到IIS中,運行

沒有出現但願效果,這是由於經過IIS請求 並無將.JPG的格式使用.NET引擎進行解釋,而是如靜態頁面HTML同樣直接返回給了用戶,這時咱們但願用戶請求.JPG時也能像.ASPX同樣便可解決這個問題,打開IIS。選擇該網站
右鍵屬性

點擊配置

點擊添加

添加.jpg後綴的請求。交給aspnet_isapi.dll處理,這樣咱們本身寫的通常處理程序 Handler1.ashx就有效果了,
也許多心的朋友會問,咱們不是在web.config中寫了這樣一個配置的嗎?爲何沒有做用呢。這是因爲IIS對.jpg後綴的請求直接就加載圖片返回了,這裏並不會使用aspnet_isapi.dll處理,因此也就更加到達不了Handler1.ashx這一步,當咱們在IIS中配置後,便可實現!

根據相同的原理也能夠實現 下載文件的防盜鏈~原理雷同~ 

拓展一下,使用該法還能夠解決站內新聞資訊被人使用蜘蛛程序抓取的問題!

不過此法並不是沒有缺點,首要的就是會下降系統的性能!這個要看我的權衡了!服務器

相關文章
相關標籤/搜索