zoukankan      html  css  js  c++  java
  • 图片盗链分析(一)

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

    一步一步的进行。

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

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

  • 相关阅读:
    c#数据结构与算法
    学习资源---.NET
    怎样完全删除sqlserver
    树,森林 二叉树之间转化 原理
    ref 和out 区别
    GridView批量删除记录、全选及弹出确认对话框
    .NET基础 小记--------2013.8.10
    Xml 读写
    同步 异步 区别
    委托学习
  • 原文地址:https://www.cnblogs.com/jams742003/p/1660917.html
Copyright © 2011-2022 走看看