现在探讨一下网站图片防盗链

一步一步的进行。

(一) 一个网页中对同域的图片的访问

[准备]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

·Host192.168.1.105:8029

<2>请求图片

·(Request-Line)GET /images/a1.gif HTTP/1.1

·Host192.168.1.105:8029

·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文件

<form id="form1" runat="server">

    <div>

        <img src="http://192.168.1.105:8029/images/a1.gif" />

    </div>

    </form>

(2)在浏览器中访问

2个请求

<1>请求Test.aspx

·(Request-Line) GET /web2/Test.aspx HTTP/1.1

·Hostlocalhost:20372

<2>请求图片资源

·(Request-Line)GET /images/a1.gif HTTP/1.1

·Host192.168.1.105:8029

·Refererhttp://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 /Default.aspx HTTP/1.1

·Host192.168.1.105:8029

<2>请求图片资源

·(Request-Line)GET /Img.ashx?img=a1.gif HTTP/1.1

·Host192.168.1.105:8029

·Refererhttp://192.168.1.105:8029/Default.aspx

第二次请求中,hostrefererHost部分相同,则返回正常的图片

(五)异域访问

(1)在网站2中,添加对图片的访问

<form id="form1" runat="server">

    <div>

        <img src="http://192.168.1.105:8029/Img.ashx?img=a1.gif" />

    </div>

</form>

(2)在浏览器中访问

<1>请求Test.aspx

·(Request-Line)GET /web2/Test.aspx HTTP/1.1

·Hostlocalhost:20372

<2>请求资源文件

·(Request-Line)GET /Img.ashx?img=a1.gif HTTP/1.1

·Host192.168.1.105:8029

·Refererhttp://localhost:20372/web2/Test.aspx

 

请求资源文件时,资源文件地址:Host,直接包含地址,refererhostrefererhost地址不同,所以得到的图片地址是一个防盗的图片地址。

       

(未完……

注:

http头里的两个属性

Host:客户端指定自己想访问的WEB服务器的域名/IP 地址和端口号

Referer:浏览器向 WEB 服务器表明自己是从哪个网页/URL 获得/点击 当前请求中的网址/URL

posted on 2010-02-01 12:20  梅桦  阅读(2961)  评论(4编辑  收藏  举报