.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实现图片的防盗链到这里就完成了。
浙公网安备 33010602011771号