現在探讨一下網站圖檔防盜鍊
一步一步的進行。
(一) 一個網頁中對同域的圖檔的通路
[準備]在Vs中添加一網站,添加images圖檔檔案夾,裡邊放一張a1.gif的圖檔,一張用于顯示防盜鍊的圖檔z1.gif
(1) Aspx
<form id="form1" runat="server">
<div>
<img src="images/a1.gif" />
</div>
</form>
(2)在浏覽器中通路
有2個通路請求(隻取2個屬性來分析):
<1>請求Default.aspx
·(Request-Line):GET /Default.aspx HTTP/1.1
·Host:192.168.1.105:8029
<2>請求圖檔
·(Request-Line):GET /images/a1.gif HTTP/1.1
·Referer: http://192.168.1.105:8029/Default.aspx
第一次請求的時候沒有Referer屬性值(或說為null)。第二次請求是通路資源檔案,這時,Referer就包含了一個對資源檔案的容器的位址,即圖檔a1.gif來自于http://192.168.1.105:8029/Default.aspx 。
注:http标準協定中有專門的字段記錄referer:一來可以追溯上一個入站位址是什麼;二來對于資源檔案,可以跟蹤到包含顯示他的網頁位址是什麼
(二)另一網站對圖檔的跨域連結
把上一個網站在IIS中釋出,然後在Vs中建立立網站。網站中在Test.aspx中添加圖檔
(1)aspx檔案
<img src="http://192.168.1.105:8029/images/a1.gif" />
(2)在浏覽器中通路
有2個請求
<1>請求Test.aspx
·(Request-Line): GET /web2/Test.aspx HTTP/1.1
·Host:localhost:20372
<2>請求圖檔資源
·Referer:http://localhost:20372/web2/Test.aspx
在第一次請求時,此時要向localhost請求Test.aspx。在第二次請求中,請求資源檔案a1.gif,這時要通路的主機位址為:192.168.1.105:8029,這個就是在IIS中釋出的圖檔的源伺服器。而Referer還是Test.aspx所在的網站的請求位址。也就是圖檔a1.gif的的包含容器。這兩個位址不同了,可以利用這個特征來防止圖檔的盜鍊:如果資源檔案的(直接)包含位址與源位址相同則可以使用圖檔,否則就是盜鍊。
(三)添加圖檔過濾img.ashx檔案
context.Response.ContentType = "image/jpg";
if (context.Request.UrlReferrer != null &&
context.Request.UrlReferrer.Host.Equals(context.Request.Url.Host,
StringComparison.InvariantCultureIgnoreCase))
context.Response.WriteFile(context.Server.MapPath("~/images/" +
context.Request.QueryString["img"]));
else
context.Response.WriteFile(context.Server.MapPath("~/images/z1.gif"));
ContentType設定為圖檔。判斷當請求的(圖檔)資源的源位址(Host)與直接引用位址(Referere)相同,才可以傳回請求的圖檔,否則把圖檔引用指向自定義的防盜圖檔。此時的圖檔引用要改成:
<img src="Img.ashx?img=a1.gif" />
(四)通過加防盜的同域資源通路
(1)default.aspx檔案
圖檔引用改為:<img src="Img.ashx?img=a1.gif" />
(2)在浏覽器中浏覽
兩個請求
<1>請求default.aspx
·(Request-Line):GET /Img.ashx?img=a1.gif HTTP/1.1
·Referer:http://192.168.1.105:8029/Default.aspx
第二次請求中,host與referer的Host部分相同,則傳回正常的圖檔
(五)異域通路
(1)在網站2中,添加對圖檔的通路
<img src="http://192.168.1.105:8029/Img.ashx?img=a1.gif" />
</form>
·(Request-Line):GET /web2/Test.aspx HTTP/1.1
<2>請求資源檔案
請求資源檔案時,資源檔案位址:Host,直接包含位址,referer,host與referer的host位址不同,是以得到的圖檔位址是一個防盜的圖檔位址。
(未完……)
注:
http頭裡的兩個屬性
Host:用戶端指定自己想通路的WEB伺服器的域名/IP 位址和端口号
Referer:浏覽器向 WEB 伺服器表明自己是從哪個網頁/URL 獲得/點選 目前請求中的網址/URL。
部落格園大道至簡
<a href="http://www.cnblogs.com/jams742003/" target="_blank">http://www.cnblogs.com/jams742003/</a>
轉載請注明:部落格園