ASP.NET圖片盜鏈問題

來源:互聯網
上載者:User
1什麼是圖片盜鏈

  讓我們先分析一般的瀏覽現象,其中最重要的一點就是一個完整的頁面並不是一次全部傳送到用戶端的.如果你請求的是一個帶有許多圖片和其它資訊的頁面,那麼最先的一個Http請求被傳送回來的是這個頁面的文本,然後通過用戶端的瀏覽器對這段文本的解釋執行,發現其中還有圖片,那麼用戶端的瀏覽器會再發送一條 Http請求,當這個請求被處理後那麼這個圖片檔案會被傳送到用戶端,然後瀏覽器回將圖片安放到頁面的正確位置,就這樣一個完整的頁面也許要經過發送多條 Http請求才能夠被完整的顯示.基於這樣的機制,就會產生一個問題,那就是盜鏈問題:就是一個網站中如果沒有起頁面中所說的資訊,例片資訊,那麼它完全可以將這個圖片的串連到別的網站.這樣沒有任何資源的網站利用了別的網站的資源來展示給瀏覽者,提高了自己的訪問量,而大部分瀏覽者又不會很容易地發現,這樣顯然,對於那個被利用了資源的網站是不公平的.

  2 解決方案

  那麼現在利用ASP.NET中的這HttpHandler能夠很好地解決這個問題,之所以能夠發生這個問題.就是因為我們在預設狀態下只處理那些動態網頁,象asp,aspx等等,但當有請求一個圖片檔案時,IIS就會直接提取資源並發送給用戶端,這樣看來就顯得有些盲目了吧

  所以我們要建立自己的HttpHandler來處理圖片檔案。例如jpg檔案。

  3 那麼我們如何建立自己的HttpHandler並在web應用程式中註冊呢?

  (1)建立自己的HttpHandler

  建立一個繼承了System.Web.IHttpHandler介面的類,在System.Web.IHttpHandler介面只有兩個成員

  1 IsReusable 屬性,其返回一個值代表其他http請求是否可以使用當前繼承了 System.Web.IHttpHander介面的類的執行個體。

  2 ProcessRequest(System.Web.HttpContext context) 方法,除了使用者自訂中被要求處理的特殊的http請求。

  其中的參數 System.Web.HttpContext 類的執行個體裝入了一個http請求中http協議中要求的所有資訊。其中System.Web.HttpContext 類中包含有屬性 Request 使得從用戶端發送過來的http請求資訊的值可以被方便地讀取;屬性Response ,其中封裝了需要返回給用戶端的資訊和操作。當然還有許多常用的屬性和方法,在此就不詳述了,我們這裡只用到這兩個屬性。

  (2)web應用程式中註冊自訂的HttpHandler

  在 Web.config這個網路應用程式設定檔中加入註冊資訊

<httpHandlers>
<add verb = " path = "*.jpg" type = "自訂handler的類的名稱,網路應用程式名稱" />
</httpHandlers>

  4 那麼我們看看在ProcessRequest(System.Web.HttpContext context)方法是如何對請求圖片檔案的http請求進行處理的。

public void ProcessRequest(System.Web.HttpContext context)
{
if(context.Request.UrlReferrer.Host == "www.frontfree.net")//判斷是否是本地引用,如果是則返回給用戶端正確的圖片,這裡的判斷就是用到了前面所述的http請求中所記路的參考頁資訊
{
context.Response.Expires = 0;//設定用戶端緩衝中檔案到期時間為0,即立即到期。
context.Response.Clear();//清空伺服器端為此會話開闢的輸出緩衝
context.Response.ContentType = getContentType(context.Request.PhysicalPath); //獲得檔案類型
context.Response.WriteFile(context.Request.PhysicalPath);//將請求檔案寫入到伺服器端為此會話開闢的輸出緩衝中
context.Response.End();//將伺服器端為此會話開闢的輸出緩衝中的資訊傳送到用戶端
}
Else //如果不是本地引用,則屬於盜鏈引用,返回給用戶端錯誤的圖片
{
context.Response.Expires = 0; //設定用戶端緩衝中檔案到期時間為0,即立即到期。
context.Response.Clear();//清空伺服器端為此會話開闢的輸出緩衝
context.Response.ContentType = getContentType("error.jpg"); //獲得檔案類型
context.Response.WriteFile("error.jpg");//將特殊的報告錯誤的圖片檔案寫入到伺服器端為此會話開闢的輸出緩衝中
context.Response.End();//將伺服器端為此會話開闢的輸出緩衝中的資訊傳送到用戶端
}
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.