• 图片盗链分析(二)


    HttpHandlerHttp处理中心,真正地对客户端请求的服务器页面做出编译和执行,并将处理过后的信息附加在HTTP请求信息流中再次返回到HttpModule中。HttpHandlerHttpModule不同,一旦定义了自己的HttpHandler类,那么它对系统的HttpHandler的关系将是覆盖关系,那么它就是一个全局的。

    现对网站的gif图片进行防盗。

    上一篇中通过ashx文件中对图片的处理来处理图片防盗,这里的道理是相同的。

    (一)添加自定义HttpHandler

    这里直接在网站里添加类,并添加到app_code文件夹中:

    在这个类(HttpHandler)里,通过对请求的资源文件(可能是图片,例如:gif图)进行地址判断。对于请求的资源文件有2个地址:

    ·Host:这个是请求的地址

    ·Referer:这个是资源文件直接的包含地址,例如:在盗链异域图片的网站D中,请求图片的Referer就是这个网站D的地址。

    然后因为这个图片的Referer地址与被盗的(可以说是Host)地址不同(域名不同),来响应一个固定的图片地址(盗链图片地址)来防盗链。

     

    自定义的HandlerIhttpHandler接口派生,并实现两个方法。

     

    public class GifHandler : IHttpHandler

    {

        public bool IsReusable

        {

            get { return false; }

        }

        public void ProcessRequest(HttpContext context)

        {

            string FileName = context.Server.MapPath(context.Request.FilePath);

            if (context.Request.UrlReferrer.Host == null)

            {

                return;

            }

           

            if (context.Request.UrlReferrer.Host=="192.168.1.105")

            {

                context.Response.ContentType = "image/gif";

                context.Response.WriteFile(FileName);

                FileOperation.WriteFile(

    context.Server.MapPath("../logs/"),

    "log.txt", context.Request.UrlReferrer.Host);

            }

            else

            {

                context.Response.ContentType = "image/gif";

                context.Response.WriteFile("z1.gif");

            }    

        }

    }

    ·判断是不是第一次请求,可以理解为是不是请求资源

    context.Request.UrlReferrer.Host == null

    ·因为是请求资源,所以得到请求资源的资源的地址:

    string FileName = context.Server.MapPath(context.Request.FilePath);

    这里跟踪一下,这时,这个FileName的值是:E:\test8\FangdaoTest\images\a1.gif

    本地测试时这里是一个完全的物理地址,通过它能找到这个文件。

    ·FileOperation.WriteFile方法。自己定义了一个文件写入方法,用于跟踪一些信息

    ·如果资源文件的请求地址是本域的,则返回正常的图片,否则显示盗链地址的图片

    ·这个Handler定义完后,还不能生效,要进行以下2步才可以。

    (二)Web.Config中注册

    system.web章节中定义:

    <httpHandlers>

                <add path="*.gif" verb="*" type="GifHandler"/>

        </httpHandlers>

    system.web章节中添加HttpHandlers节,并添加自定义的Handler

    ·path:表示请求的文件,这里表示所有的gif文件

    ·verb:谓词,这里接受任何谓词,即不管是post还是get,只要文件是gif的,就要通过这个handler来处理

    ·type:指定程序集,这里因为是在app_code里添加的类,所以这里只写类名就行了。

    完成这2步就可以测试了。但对盗链不起作用,因为在IIS中还要添加对Gif图的映射处理。

    (三)IIS中添加gif映射

    ·添加aspnet_isapi.dll,这里随便打开一个,复制一下就行了

    ·扩展名:.gif

    以上三步完成后,gif图防盗就生效了

    (四)在发布的网站上使用图片

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

        <div>

            <img src="images/a1.gif" />

        </div>

    </form>

    页面效果:

    (五)  Test.aspx中使用图片

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

        <div>

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

        </div>

    </form>

    页面效果:

  • 相关阅读:
    vue 组件传值
    ES6 解构赋值
    JS filter的使用
    FormData实现文件上传
    vue+element 表格导出Excel文件
    vue2.0 element-ui中input的@keyup.native.enter='onQuery'回车查询刷新整个表单的解决办法
    vue2.0 element-ui中el-upload的before-upload方法返回false时submit()不生效解决方法
    JavaScript正则表达式检验手机号码、邮箱、ip地址等
    Vue 2.0 pagination分页组件
    angular环境
  • 原文地址:https://www.cnblogs.com/jams742003/p/1661050.html
Copyright © 2020-2023  润新知