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


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

<form id="form1" runat="server">
<div>
<img src="images/logo.jpg" />
</div>
</form>
這裏使用HttpHandler來處理盜鏈問題
新建立一個 一般處理程序 Handler1.ashx.代碼及註釋如下
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中配置後,即可實現!

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

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

不過此法並非沒有缺點,首要的就是會降低系統的性能!這個要看個人權衡了!
發佈了6 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章