.NET MVC自定义Handler实现图片防盗链

:)话不多说直接步入正题,下面将要通过自定义handler实现图片防盗链的技巧。

 

handler是.net mvc生命周期中的一部分,主要负责处理请求。具体生命周期的详解请参考http://www.cnblogs.com/xuxing2016/p/7772577.html

下面通过一个小demo实现基于.net mvc自定义handler的图片防盗链。基于(vs2017,IIS10)

Step1:创建一个类,实现IHttpHandler接口:

using System.Web;

namespace CustomHandler
{
    public class JpgHandler : IHttpHandler
    {
        public bool IsReusable
        {
            get { return true; }
        }

        public void ProcessRequest(HttpContext context)
        {
            string FileName = context.Server.MapPath(context.Request.FilePath);//获取filepath的绝对路径
            if(context.Request.UrlReferrer == null)//判断请求的referrer是否为空
            {
                context.Response.ContentType = "image/JPEG";
                context.Response.WriteFile("~/Images/error-502.png");
                return;
            }
            if (context.Request.UrlReferrer.Host == null)//判断Host是否为空
            {
                context.Response.ContentType = "image/JPEG";
                context.Response.WriteFile("~/Images/error-502.png");
            }
            else
            {
                if (context.Request.UrlReferrer.Host.IndexOf("host") > 0)//ps:将"local"替换成自己的主机名,本地调试无需改变
                {
                    context.Response.ContentType = "image/JPEG";
                    context.Response.WriteFile(FileName);
                }
                else
                {
                    context.Response.ContentType = "image/JPEG";
                    context.Response.WriteFile("~/Images/error-502.png");
                }
            }
        }


       
    }
}

通过ProcessRequest方法判断请求是否合法,如果不合法,则渲染"~/Images/error-502.png",若合法,则按原路径渲染。

如此,我们便实现了专门处理图片请求的handler。接下来我们需要在Config文件中进行注册。

 

Step2:

在webconfig中我们需要在<system.webserver>节点下进行配置handler。

(IIS6是在system.web节点下配置,配置有所不同,IIS7之后如下配置在system.webserver节点下,详情请参考https://msdn.microsoft.com/zh-cn/library/46c5ddfy(v=vs.100).aspx)

<system.webServer>
    <handlers>
      <add  verb="*" path="*.jpg" name="JpgHandler" type="CustomHandler.JpgHandler" />
    </handlers>
  </system.webServer>

其中verb指的是请求此文件的方式,可以是post或get,用*代表所有访问方式。path是handler所处理的请求扩展名,例如*.jpg,*.png等,需要处理多种后缀名可在path中用逗号隔开。type表示命名空间和类名。

 

Final:

现在我们将home的index页面替换成一张图片

<img src="~/Images/tooopen_sy_155168162826.jpg" />

运行之后,我们发现图片正常

接着我们再试试请求http://localhost:52547/Images/tooopen_sy_155168162826.jpg(具体地址看你们自己的端口号)

现在我们的请求是没有referrer的,通过handler的处理,将显示为如下:

 

到这里,通过分析请求的referrer实现图片的防盗链到这里就完成了。

posted @ 2017-11-06 15:33  Eric.Hsu  阅读(263)  评论(0)    收藏  举报