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

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

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

 

o_MvcRouting.gif

 

     在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

Vite与Webpack路径配置大不同:从Vue2迁移到Vue3必须知道的public目录使用技巧 本文详细解析了Vite与Webpack在public目录路径配置上的核心差异,为Vue2迁移到Vue3的开发者提供实用指南。重点对比了两种构建工具的资源处理逻辑,给出典型编警告的解决方案,并分享路径适配表与高级优化技巧,帮助开发者高效完成技术栈升级。 阅读详情

相关推荐

H3C交换机命令大全,分模块好记忆!

在深入命令之前,我们先来了解H3C交换机的命令行基础。<H3C>[H3C]常用基础命令如下:这些基础命令是操作H3C交换机的敲门砖,熟练掌握后,我们将按模块深入探讨更具体的配置命令。H3C交换机的命令可以按功能模块分类,包括系统管理、接口配置、VLAN操作、链路聚合、路由配置、安全管理等。

网络技术联盟站 755

Asp.net MVC 利用自定义RouteHandler防止图片盗链

      你曾经注意过在你服务器请求日志中多了很多对图片资源的请求吗?这可能是有人在他们的网站中盗链了你的图片所致,这会占用你的服务器带宽。下面这种方法可以告诉你如何在ASP.NET MVC中实现一个自定义RouteHandler防止其他人盗链你的图片.       首先,我们来回顾一下当一个请求发往ASP.net MVC站点时的情景,IIS收到请求并将请求ASP.net,然后根据UR...

weixin_34122810的博客 137

DC Error: The power pin VDD on the cell UASA1/CG_X8_Rdsd2pcm is unconnected. (UPF-581)

【代码】DC Error: The power pin VDD on the cell UASA1/CG_X8_Rdsd2pcm is unconnected. (UPF-581)

baidu_34971492的博客 942

Asp.net MVC 自定义RouteHandler

<br />asp.net mvc 流程初探,可参考:<br /> <br />http://blog.csdn.net/shaily/archive/2009/07/02/4315547.aspx<br /> <br />    在ASP.NET MVC程序中首先涉及的部件是UrlRoutingModule,它是System.Web.Routing的一部分.UrlRoutingModule用于第一次检查请求的url和本地磁盘中的文件是否相匹配。如果匹配,UrlRoutingModule会将请求直接回发给I

sowhat430的专栏 3827

Asp.net MVC学习日记五(自定义RouteHandler

1、Global.asax中添加 routes.MapRoute("DbContent", "{*path}",new { controller = "Home" }).RouteHandler = new CatalogRouteHandler(); 2、在Controller文件夹下,添加CatalogRouteHandler类,让其继承自IRouteHandler public cla...

webcenterol 219

Url重写——伪静态实现

简述: 在我们浏览网站的时候,很多都是以.html结尾的。难道这些都是静态网页么?其实不是的,它们很多是伪静态 那么什么是伪静态?顾名思义,就是假的静态页面。通过某种设置让你看成是静态的。 Q:为何要使用伪静态? A:因为可以提高网站安全性,让别人不能一眼看出你的网站是什么语言开发的。 PS:目前本人只学了.net,那么就以(webform)和 (MVC)网站为例进行详解。 开始正文: ...

weixin_30372371的博客 378

利用MVC实现自定义RouteHandler防止图片盗链

<br />你曾经注意过在你服务器请求日志中多了很多对图片资源的请求吗?这可能是有人在他们的网站中盗链了你的图片所致,这会占用你的服务器带宽。下面这种方法可以告诉你如何在ASP.NET MVC中实现一个自定义RouteHandler防止其他人盗链你的图片.<br />      首先,我们来回顾一下当一个请求发往ASP.net MVC站点时的情景,IIS收到请求并将请求ASP.net,然后根据URL,或者更确切来说:被请求文件的扩展名.在IIS7 integrated模式下(默认模式),所有的请求都会

simenpeng的专栏 1236

ASP.NET MVC 利用IRouteHandler, IHttpHandler实现图片盗链

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

雨燕的博客 334

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

本文告诉你如何在ASP.NET MVC中实现一个自定义RouteHandler防止其他人盗链你的图片. 首先,我们来回顾一下当一个请求发往ASP.net MVC站点时的情景,IIS收到请求并将请求ASP.net,然后根据URL,或者更确切来说:被请求文件的扩展名.在IIS7 integrated模式下(默认模式),所有的请求都会匹配到ASP.net中,而在IIS6中,你可以通过通配符来达到

chengly0129的专栏 1278

Asp.net MVC 利用自定义RouteHandler防止图片盗链

你曾经注意过在你服务器请求日志中多了很多对图片资源的请求吗?这可能是有人在他们的网站中盗链了你的图片所致,这会占用你的服务器带宽。下面这种方法可以告诉你如何在ASP.NET MVC中实现一个自定义RouteHandler防止其他人盗链你的图片. 首先,我们来回顾一下当一个请求发往ASP.net MVC站点时的情景,IIS收到请求并将请求ASP.net,然后根据URL,...

weixin_30664051的博客 155

:【Asp.net MVC 利用自定义RouteHandler防止图片盗链

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

weixin_30809333的博客 102

【软测】接口自动化入门:requests + pytest + pymysql 三件套实战

库定位在自动化中承担的角色requestsHTTP 客户端模拟客户端,发送接口请求pytest测试框架组织用例、执行断言、生成测试报告pymysqlMySQL 驱动操作数据库,做数据准备与结果校验pytest 组织用例├─ pymysql 预置/清理测试数据├─ requests 调用被测接口└─ assert 断言响应结果(必要时 pymysql 回查数据库验证)requests:把请求信息字典化 +解包,是数据驱动框架的第一块砖;

2301_81499791的博客 202

环境不稳、用例乱跳?Playwright自动化避坑大全

一、测试环境不稳定即使你的脚本写得再完美,如果测试环境自身不稳定,也会导致测试失败。常见原因:1. 网络波动:测试机与被测系统之间的网络不稳定。2

2601_96238782的博客 161

aiDgeController 软PLC虚拟机stvm集成测试报告

项目版本日期测试环境: WSL Debian 13 + GCC 14,X64_DBG 构建,全程启用 AddressSanitizer被测范围。

会周易的程序猿的博客 328

企业接口自动化中,单例模式如何优雅处理不同租户和不同角色的登录

一个类在整个进程中只保留一个实例,后续再创建时返回的还是同一个对象。你可以把它理解成“全局只有一个管家”。在这个项目里,和都是这个思路。这意味着:不会重复创建鉴权管理器它内部的缓存状态可以统一共享登录态、配置、环境信息都可以集中管理用单例统一管理鉴权对象,用缓存避免重复登录,用 fixture 注入不同角色和租户,用客户端封装不同系统的登录差异。这套设计的核心不是“炫技”,而是为了让企业级接口自动化更稳定、更易维护。这篇文章讲的不是一个简单的登录函数,而是一套适合企业接口自动化的鉴权基础设施。

Tizzy的博客 453

Pytest 自动化工程结构设计(多设备、多业务线、多层级 )

1. 公共参数放外层 conftest2. 业务参数放业务目录 conftest3. 参数只用 request.config.getoption 获取4. 设备连接放 fixture5. 业务对象放 context6. test 文件只写测试流程7. log 和 Allure 逻辑抽到 common_lib8. 初始化对象和参数要区分清楚9. Watch-only 和 Watch+Phone 分开 fixture10. 不要在多个 conftest 重复注册同名 pytest 参数。

weixin_46903933的博客 251

Stimulsoft Reports.Net 自定义函数实战:财务报表金额中文大写与含税价统一计算

本文用 C# 把「中文大写金额」「含税价」等财务口径封装为 Stimulsoft 报表自定义函数,详解 2026.3 特性标注与全版本 AddFunction 兜底、完整实现代码、表达式调用与单元测试,帮助 .NET 团队统一财务单据口径。

励志做最业余的专业博主,控件产品可以私我~ 336

前端测试完整指南:从单元测试、组件测试到端到端测试与 CI/CD

本文系统介绍前端测试体系,涵盖静态检查、单元测试、组件测试、接口模拟、端到端测试、视觉回归、可访问性、性能与安全测试,并结合 Vitest、Testing Library、MSW、Playwright 等工具提供实战示例,同时讲解覆盖率治理、测试稳定性、CI/CD 质量门禁及老项目落地方案,帮助团队建立可靠、可维护的前端质量保障体系。

qq_29029209的博客 216

GD32F103xx用户手册V1.0

GD32F103xx用户手册V1.0(中文版)

彻底移除Windows Defender

彻底移除Windows Defender,包含详细教程及工具,按照教程中顺序操作即可

上一篇: RHCE学习笔记:RH133 2.4-管理文件系统(1)
下一篇: HTML介绍
weixin_34144848
博客等级 码龄11年 4039粉丝 171原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值