你曾经注意过在你服务器请求日志中多了很多对图片资源的请求吗?这可能是有人在他们的网站中盗链了你的图片所致,这会占用你的服务器带宽。下面这种方法可以告诉你如何在ASP.NET MVC中实现一个自定义RouteHandler来防止其他人盗链你的图片.

首先,我们来回顾一下当一个请求发往ASP.net MVC站点时的情景,IIS收到请求并将请求转到ASP.net,然后根据URL,或者更确切来说:被请求文件的扩展名.在IIS7 integrated模式下(默认模式),所有的请求都会匹配到ASP.net中,而在IIS6中,你可以通过通配符来达到和IIS7相同的效果.

在ASP.NET MVC程序中首先涉及的部件是UrlRoutingModule,它是System.Web.Routing的一部分.UrlRoutingModule用于第一次检查请求的url和本地磁盘中的文件是否相匹配。如果匹配,UrlRoutingModule会将请求直接回发给IIS,IIS根据地址来进行相应。如果UrlRoutingModule没有在磁盘中找到匹配的文件。它会检查RouteCollection结构来决定是否继续传递请求.UrlRoutingModule会引入RouteHandler和匹配的路径入口(默认情况下是MvcRouteHandler)。而后会引入合适的HttpHandler来处理和请求有关的逻辑。默认情况下,这个HttpHandler会是MvcHandler.而对于图片文件,一般会存在于程序中的某个子目录中,核心的routeModule并没有这种能力因为直接索取图片的url回优先回发给iis,而流程在这时无法执行到RouteHandler被引入.

通常情况下,通过Asp.net取出磁盘上的静态文件都是可以的。然而,如果你想执行一些业务逻辑而不是直接让这类文件响应请求。你需要在某些关键点以编程的方式实现。你可以通过设置RouteTable.Routes.RouteExistingFiles = true来避免对现有文件的默认相应行为。Phil Haack( ASP.NET MVC的高级程序经理)称之为”核武器级别的选项”,无论是css,js,doc,pdf等文件,在这种模式下所有文件都需要利用Routing来处理。所以确保这一点的关键是对于静态文件的请求不能和磁盘上对应的文件匹配。这会强制RouteModule来对Route表(当然会引入RouteHandler等过程)进行查找。这很容易做,只需要让<img>元素指向一个虚构的目录即可。比如说,你的图片是存放在网站根目录下的images文件夹下,而<img>元素指向一个”graphics”文件夹将不会和存在的文件相匹配。

想做到这些,需要做如下:

  1. 为对于图片的请求注册Route
  2. 创建RouteHandler来处理这类请求
  3. 创建HttpHandler来处理实际的请求

我们首先从步骤2开始,因为如果没有创建RouteHandler却要在路由表中进行注册的话,这不会编译成功的.

RouteHandler很简单,它是IRouteHandler的实现,它只有一个方法--IHttpHandler IRouteHandler.GetHttpHandler(RequestContext requestContext):

public class ImageRouteHandler : IRouteHandler{  public IHttpHandler GetHttpHandler(RequestContext requestContext)  {    return new ImageHandler(requestContext);  }}

对于实际的HttpHandler:

public class ImageHandler : IHttpHandler{  public ImageHandler(RequestContext context)  {    ProcessRequest(context);  }  private static void ProcessRequest(RequestContext requestContext)  {    var response = requestContext.HttpContext.Response;    var request = requestContext.HttpContext.Request;    var server = requestContext.HttpContext.Server;    var validRequestFile = requestContext.RouteData.Values["filename"].ToString();    const string invalidRequestFile = "thief.gif";    var path = server.MapPath("~/graphics/");    response.Clear();    response.ContentType = GetContentType(request.Url.ToString());    if (request.ServerVariables["HTTP_REFERER"] != null &&        request.ServerVariables["HTTP_REFERER"].Contains("mikesdotnetting.com"))    {      response.TransmitFile(path + validRequestFile);    }    else    {      response.TransmitFile(path + invalidRequestFile);    }    response.End();  }  private static string GetContentType(string url)  {    switch (Path.GetExtension(url))    {      case ".gif":        return "Image/gif";      case ".jpg":        return "Image/jpeg";      case ".png":        return "Image/png";      default:        break;    }    return null;  }  public void ProcessRequest(HttpContext context)  {  }  public bool IsReusable  {    get { return false; }  }}

在上面代码中,IHttpHandler中的ProcessRequest,有两个重载,第一个是public void ProcessRequest(HttpContext context),在这里我们忽略这个重载,在MVC程序中,我们传入RequestContext对象作为参数,而不是HttpContext对象。ProcessRequest方法会在ImageHandler的构造器中进行调用,在上面代码中,ProcessRequest会首先检查请求图片的地址是否输入我的域(也就是引用图片的网页是我的网站而不是其它人的),如果不是的话,则返回一张其它图片。返回什么样的图片取决于你自己,我看到过很多种这样的图片,有些包含不和谐内容.甚至你可以返回一个1px的透明gif,或者可以使404 not found….

当然,在这点上你还可以采取一些其它步骤,比如说,你当然会希望google索引你的图片,所以如果引用的链接包含”images.google”你可以返回真实图片。你也可以在其它网站盗链你图片不成功的情况下来用日志进行记录.

最后一步要做的是为对图片的请求注册到RouteTable,用于表示ImageRouteHandler来对这部分请求进行处理,在global.axax文件中,加入:

routes.Add("ImagesRoute",                 new Route("images/{filename}", new ImageRouteHandler()));

希望这篇文章不仅可以帮助你阻止那些盗链的吸血鬼,还能让你对Asp.net MVC的底层有更深入的了解以便于你以后再有其他需求时可以进行扩展。

-----------------------------------------------------------------------------

原文链接:http://www.mikesdotnetting.com/Article/126/ASP.NET-MVC-Prevent-Image-Leeching-with-a-Custom-RouteHandler

【译】Asp.net MVC 利用自定义RouteHandler来防止图片盗链 (转)相关推荐

  1. [ASP.NET MVC] 利用自定义的AuthenticationFilter实现Basic认证

    很多情况下目标Action方法都要求在一个安全上下文中被执行,这里所谓的安全上下文主要指的是当前请求者是一个经过授权的用户.授权的本质就是让用户在他许可的权限范围内做他能够做的事情,授权的前提是请求者 ...

  2. Asp.net MVC防止图片盗链的实现方法,通过自定义RouteHandler来操作

    本文告诉你如何在ASP.NET MVC中实现一个自定义RouteHandler来防止其他人盗链你的图片. 首先,我们来回顾一下当一个请求发往ASP.net MVC站点时的情景,IIS收到请求并将请求转 ...

  3. npoi的mvc怎么ajax导出,asp.net mvc利用NPOI导入导出Excel解决方法

    asp.net mvc利用NPOI导入导出Excel 导出Excel 2003没有问题,导出Excel2007老是出现无法访问已关闭的流,请帮忙解决,或是哪位有mvc导入导出excel的工具类能提供, ...

  4. 第十三节:HttpHander扩展及应用(自定义扩展名、图片防盗链)

    一. 自定义扩展名 1. 前言 凡是实现了IHttpHandler接口的类均为Handler类,HttpHandler是一个HTTP请求的真正处理中心,在HttpHandler容器中,ASP.NET ...

  5. ASP.NET_阻止图片盗链

    什么是图片盗链   一般的浏览现象,其中最重要的一点就是一个完整的页面并不是一次全部传送到客户端的.如果你请求的是一个带有许多图片和其他信息的页面,那么最先的一个HTTP请求被传送回来的是这个页面的文 ...

  6. 利用Cookie Stuffing让图片盗链者为我们赚钱

    最近没神马好的思路来更新wordpress教程,索性水一贴其他教程~,看到首先魔客吧来解释下什么是cookie stuffing. cookies是通过html中header(头部信息)传递的,除非浏 ...

  7. ASP.NET MVC: 使用自定义 ModelBinder 过滤敏感信息

    昨天发表了一篇随笔<ASP.NET MVC: 使用 Filters 附加过滤敏感信息功能>(以下简称<Filter过滤>),今天一早醒来发现一处重大漏洞,于是在发了一条评论指出 ...

  8. ASP.NET MVC - 设置自定义IIdentity或IPrincipal

    我需要做一些相当简单的事情:在我的ASP.NET MVC应用程序中,我想设置一个自定义IIdentity / IPrincipal. 哪个更容易/更合适. 我想扩展默认值,以便我可以调用User.Id ...

  9. asp.net MVC之 自定义过滤器(Filter)

    一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration:缓存的时间,以秒为 ...

最新文章

  1. 想改善风险管理工作吗?做些基础性工作吧
  2. application.yml如何显示成小叶子图标
  3. 为什么Flink会成为下一代大数据处理框架的标准?
  4. 关于我使用的angular.js的上传---FileUploader
  5. Spring中获取request的方法及其线程安全性分析
  6. [Angular 2] Transclusion in Angular 2
  7. 如何设置二进制某一位的值_mysql参数设置--max_allowed_packet 值如何调整?
  8. 对接海康威视监控-hls实现h5播放
  9. 交换机Vlan中 tagged和untagged的区别
  10. 目标检测、语义分割性能指标
  11. 【MM32F5270开发板试用】一、移植 TencentOS 到 PLUS-F5270
  12. 小学计算机应用到英语课教案,信息技术助力小学英语课堂教学妙招
  13. ubuntu本地安装中文
  14. 前馈神经网络(Feedforward neural network)
  15. PumpkinRaising靶机渗透
  16. 无损音乐刻录成cd有意义吗_无损和CD不一样?无损音乐的“玄学”知多少?
  17. ES6(ECMAScript)快速使用
  18. 富爸爸穷爸爸第二章的思考
  19. cf#644 div2 B. Boboniu Plays Chess
  20. C#子窗体控制父窗体dgv刷新

热门文章

  1. Oracle Dataguard 主备库的切换方法
  2. python 和 matlab的caffe读数据细节
  3. Mysql 添加用户和数据库授权
  4. linux rpm 安装包制作
  5. [转载]中国工商银行软件开发部门职业发展
  6. form表单序列化去除空值
  7. Nginx的upstream目前支持5种分配方式
  8. CSS 后台布局实例
  9. 《Linux shell变量总结回顾》RHEL6
  10. 安装nginx1.8