Asp .Net Web Forms 系列:配置图片防盗链的几种方法

通过 URL Rewrite Module 组件

URL Rewrite Module 是一个用于在 ASP.NET Web Forms 或其他基于 IIS 的 Web 应用程序中重写 URL 的强大工具。这个模块允许你将复杂的、不易于记忆或不利于搜索引擎优化的 URL 转换为更简洁、更友好的格式。通过 URL 重写,你可以提高网站的用户体验,增强搜索引擎排名,并更好地控制 URL 结构。

URL Rewrite Module 的主要特点包括:

  • 规则定义:你可以定义一系列规则,用于匹配传入的 URL 模式,并将其重写到新的 URL。这些规则可以基于正则表达式、通配符或其他逻辑进行定义,非常灵活。

  • HTTP 头和服务器变量:重写规则可以基于 HTTP 请求头、服务器变量或其他条件进行匹配和执行。这使得你可以根据特定的请求属性或上下文来定制 URL 重写逻辑。

  • 重定向和自定义响应:除了简单的 URL 重写,你还可以使用 URL Rewrite Module 来定义重定向规则,将用户从一个 URL 自动转发到另一个 URL。此外,你还可以发送自定义的 HTTP 响应或中止请求。

  • 性能优化:URL 重写模块在 IIS 管道中早期阶段处理请求,因此它不会对应用程序的性能产生负面影响。相反,通过优化 URL 结构,它可以提高网站的可访问性和响应速度。

  • 集成与扩展性:URL Rewrite Module 与 IIS 紧密集成,可以方便地通过 web.config 文件进行配置和管理。此外,它还支持导入其他 Web 服务器(如 Apache)的重写规则,方便迁移和集成。

示例

Url Rewite 官网 下载 URL Rewrite Module 2.1 并安装

image

image

{HTTP_REFERER} 模式为: ^http://localhost/.*$, 意思是 请求 HTTP_REFERER 必须包含 http://localhost/ 字符,规则当然是根据自己的情况写。

添加保存后,站点的 web.config 文件的 system.webServer 节点下就多了 rewrite 节点,配置如下。

	<system.webServer><rewrite><rules><rule name="防盗链" stopProcessing="true"><match url=".*\.(gif|jpg|png)" /><!--<action type="Redirect" url="http://www.baidu.com" />--><action type="CustomResponse" statusCode="403" subStatusCode="403" statusReason="Please do not steal my pictures" statusDescription="Please do not steal my pictures" /><conditions><add input="{HTTP_REFERER}" pattern="^http://localhost/.*$" negate="true" /></conditions></rule></rules></rewrite></system.webServer>

效果

image

自定义 HttpModule 处理

在 ASP.NET 中,HttpModule 是一个用于处理 HTTP 请求和响应的重要组件。通过实现 IHttpModule 接口并定义 Init 和 Dispose 方法,你可以创建自定义的 HttpModule,并在 ASP.NET 请求处理管道中的不同阶段插入自定义逻辑。

HttpModule 的主要作用包括:

  • 请求和响应处理:你可以在请求到达页面或处理程序之前或之后执行自定义代码,例如添加 HTTP 头、修改响应内容、执行身份验证或授权逻辑等。

  • 事件处理:HttpModule 可以订阅 HttpApplication 对象上的各种事件,如 BeginRequest、EndRequest、AuthenticateRequest 等,以便在请求处理的不同阶段执行代码。

  • 全局功能:由于 HttpModule 在整个 ASP.NET 应用程序中都是全局的,因此它们非常适合用于实现跨多个页面或处理程序的通用功能。

  • 性能监控和日志记录:你可以使用 HttpModule 来监控应用程序的性能,记录请求和响应的详细信息,以便进行故障排除和性能优化。

在 ASP.NET 中,HttpModule 通过订阅 HttpApplication 对象的事件来参与请求处理管道的不同阶段。这些事件允许你在请求的生命周期中的特定点执行自定义逻辑。以下是一些 HttpApplication 事件,你可以在 HttpModule 的 Init 方法中订阅它们:

  • BeginRequest:当 ASP.NET 接收到一个新的 HTTP 请求时触发。这是处理请求的最早阶段,可以在此阶段执行诸如 URL 重写、请求验证或日志记录等操作。

  • AuthenticateRequest:在 ASP.NET 对请求进行身份验证时触发。通常在此阶段使用配置的身份验证模块来确定用户的身份。

  • PostAuthenticateRequest:在身份验证过程完成后触发。可以在此阶段访问身份验证的结果或执行与身份验证相关的后处理逻辑。

  • AuthorizeRequest:在 ASP.NET 对请求进行授权时触发。在此阶段,可以基于用户的身份或其他条件确定是否允许访问请求的资源。

  • PostAuthorizeRequest:在授权过程完成后触发。可以在此阶段访问授权的结果或执行与授权相关的后处理逻辑。

  • ResolveRequestCache:在 ASP.NET 尝试从缓存中获取请求的响应时触发。如果请求的内容已经在缓存中,则可以直接从缓存中提供响应,而无需执行后续的处理程序。

  • PostResolveRequestCache:在检查缓存并确定是否使用缓存响应后触发。无论是否使用了缓存,都会触发此事件。

  • MapRequestHandler:在 ASP.NET 确定要处理请求的 HTTP 处理程序时触发。这通常涉及根据请求的 URL 和配置映射到适当的处理程序。

  • PostMapRequestHandler:在映射处理程序后触发。可以在此阶段访问选定的处理程序或执行与处理程序选择相关的后处理逻辑。

  • AcquireRequestState:在 ASP.NET 获取与当前请求关联的状态(如会话状态)时触发。这是处理与会话或应用程序状态相关的逻辑的好地方。

  • PostAcquireRequestState:在获取请求状态后触发。可以在此阶段访问请求状态或执行与状态获取相关的后处理逻辑。

  • PreRequestHandlerExecute:在 ASP.NET 开始执行选定的 HTTP 处理程序之前触发。这是准备请求数据或执行其他预处理逻辑的最后机会。

  • PostRequestHandlerExecute:在 HTTP 处理程序执行后触发。可以在此阶段访问处理程序的输出或执行与处理程序执行相关的后处理逻辑。

  • ReleaseRequestState:在 ASP.NET 释放与当前请求关联的状态时触发。这是清理与状态相关的资源的好时机。

  • PostReleaseRequestState:在释放请求状态后触发。可以在此阶段执行与状态释放相关的后处理逻辑。

  • UpdateRequestCache:如果请求的响应可以被缓存,则在发送响应到客户端之前触发。可以在此阶段将响应添加到缓存中,以便后续请求可以直接从缓存中获取。

  • EndRequest:在 ASP.NET 完成请求处理并将响应发送到客户端(或缓存)后触发。这是执行清理操作或记录请求结束时间的最后机会。

  • Error:在处理 HTTP 请求的过程中,如果出现未处理的异常,将触发此事件。可以在此阶段记录错误、执行错误处理逻辑或重定向到错误页面。

示例

修改 web.config 配置文件

	<system.webServer><modules><add name="antiTheftChainModule" type="AntiTheftChain.AntiTheftChainModule,AntiTheftChain" /></modules></system.webServer>

创建实现 IHttpModule 接口的 AntiTheftChainModule 类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Web;namespace AntiTheftChain
{public class AntiTheftChainModule : IHttpModule{public void Dispose(){}public void Init(HttpApplication context){context.BeginRequest += Context_BeginRequest;}private void Context_BeginRequest(object sender, EventArgs e){HttpApplication context = (HttpApplication)sender;var regex = new Regex(@"/[^/]+(.jpg|.bmp|.gif|.png)");var request = context.Context.Request;if (!regex.IsMatch(request.RawUrl)) return;if (request.UrlReferrer == null || !"127.0.0.1".Equals(request.UrlReferrer.Host)){context.Response.StatusCode = 403;context.Response.StatusDescription = "(IHttpModule) Please do not steal my pictures";context.Context.Response.End();return;}var fileName = context.Context.Server.MapPath(request.FilePath);context.Context.Response.WriteFile(fileName);}}
}

效果
image

自定义 HttpHandler 处理

HttpHandler 是 ASP.NET 中的一个重要组件,负责处理 HTTP 请求。它实际上是 ISAPI 的扩展,处于 HTTP 请求处理的最底层,负责实现具体的请求响应逻辑。

当一个 HTTP 请求通过 HttpModule 容器传递到 HttpHandler 容器中时,ASP.NET Framework 会调用 HttpHandler 的 ProcessRequest 成员方法来对这个请求进行真正的处理。HttpHandler 能够处理一种或多种类型的文件或资源,其处理逻辑是通过实现 IHttpHandler 接口来定义的。

在 ASP.NET 中,创建的 ASP.NET 页面(如.aspx 文件)通常会被视为 HttpHandler,因为它们实现了 IHttpHandler 接口,并最终负责生成 HTTP 响应。然而,有时我们可能需要处理非 HTML 类型的响应,如 XML 数据或图片等,这时就可以通过自定义 HttpHandler 来实现。

自定义 HttpHandler 能够让你更灵活地控制请求的处理方式,实现更复杂的业务逻辑。例如,你可以创建一个自定义的 HttpHandler 来处理特定的文件类型,或者在处理请求之前进行身份验证和授权检查。

此外,HttpHandler 还提供了对 HTTP 请求和响应的完全控制,包括读取请求头、请求体、查询字符串等信息,以及设置响应状态码、响应头、响应体等。这使得 HttpHandler 在处理复杂的 HTTP 请求和生成自定义的 HTTP 响应时非常有用。

总的来说,HttpHandler 是 ASP.NET 中处理 HTTP 请求的核心组件,通过实现 IHttpHandler 接口并定义处理逻辑,我们可以实现对 HTTP 请求的灵活处理和自定义响应的生成。

示例

修改 web.config 配置文件

	<system.webServer><handlers><add name="antiTheftChainHandler" path="*.jpg" verb="*" type="AntiTheftChain.AntiTheftChainHandler,AntiTheftChain" /></handlers></system.webServer>

创建实现 IHttpHandler 接口的 AntiTheftChainHandler 类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;namespace AntiTheftChain
{public class AntiTheftChainHandler : IHttpHandler{public const string  ImgHost = "127.0.0.1";public bool IsReusable => true;public void ProcessRequest(HttpContext context){var response = context.Response;var request = context.Request; if (request.UrlReferrer == null || !ImgHost.Equals(request.UrlReferrer.Host)){context.Response.StatusCode = 403;context.Response.StatusDescription = "(IHttpHandler) Please do not steal my pictures";response.End();return;}var fileName = context.Server.MapPath(request.FilePath);response.WriteFile(fileName);if (request.UrlReferrer == null || ImgHost.Equals(request.UrlReferrer.Host)){response.WriteFile(fileName);}else{context.Response.StatusCode = 403;context.Response.StatusDescription = "(IHttpHandler) Please do not steal my pictures";response.End();}}}
}

效果
image

HttpModule 和 HttpHandler 的区别

HttpModule 和 HttpHandler 在 ASP.NET 中各自扮演不同的角色,它们之间的主要区别体现在以下方面:

  • 功能和职责:
    • HttpModule:它主要作为 HTTP 请求的“必经之路”,位于请求处理管道中。HttpModule 可以在请求传递到最终的 HttpHandler 之前执行一些额外的操作,如安全检查、日志记录等。它也可以在某些条件下终止满足特定条件的请求,起到了过滤器的作用。每个 HTTP 请求都会逐一通过每个 HttpModule。
    • HttpHandler:它是页面请求的最终处理中心,负责处理具体的工作。每个请求最终都会交给 HttpHandler 的 ProcessRequest()方法进行处理。HttpHandler 针对不同类型的请求提供不同的处理方式。
  • 配置和使用:
    • HttpModule 的配置可以指定类名和命名空间,并且可以有多个,每个都可以订阅管道事件中的任意事件,以实现自定义功能。
    • HttpHandler 的配置则涉及可访问的文件、命名空间以及文件类型等。它更类似于 WebForm,可以指定访问特定页面的特定方法。
  • 作用范围:
    • HttpModule 相当于 Global,它的定义的方法会被所有的页面访问到。
    • HttpHandler 则针对每一种类型的请求只有一种处理方式,是覆盖关系。

总结来说,HttpModule 和 HttpHandler 在 ASP.NET 中协同工作,共同处理 HTTP 请求。HttpModule 作为过滤器,在请求处理之前进行预处理和条件判断;而 HttpHandler 则作为请求的最终处理中心,负责实现具体的请求响应逻辑。两者在配置、使用和作用范围上也有所不同,但共同构成了 ASP.NET 请求处理的关键部分。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/738440.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【存储】ZYNQ+NVMe小型化全国产存储解决方案

文章目录 1、背景2、基础理论3、设计方案3.1、FPGA设计方案3.1.1、NVMe控制器实现3.1.2、NVMe控制器实现 3.2 驱动软件设计方案3.2.1 读写NVMe磁盘软件驱动3.2.2 NVMe磁盘驱动设计3.2.3 标准EXT4文件系统设计 3.3 上位机控制软件设计方案 4、测试结果4.1 硬件测试平台说明4.2 测…

同步通信与异步通信

同步通信&#xff1a;发送方发出数据后&#xff0c;等接收方发回响应以后才发下一个数据包的通讯方式。 异步通信&#xff1a;发送方发出数据后&#xff0c;不等接收方发回响应&#xff0c;接着发送下个数据包的通讯方式。 像IIC 、SPI这类是同步通信(凡是带有时钟信号的基本上…

解码人工智能的幽默:理解其背后的误解与挑战

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

个人职业规划的制定方法

在竞争激烈的职场环境中&#xff0c;一个明确的职业规划对于个人发展至关重要。本文将探讨我的个人职场规划&#xff0c;包括短期和长期目标&#xff0c;以及实现这些目标所需的策略和行动。 一、自我评估 1.1 职业兴趣&#xff1a;我对市场营销和数据分析领域充满热情&#xf…

Day36:安全开发-JavaEE应用第三方组件Log4j日志FastJson序列化JNDI注入

目录 Java-项目管理-工具配置 Java-三方组件-Log4J&JNDI Java-三方组件-FastJson&反射 思维导图 Java知识点&#xff1a; 功能&#xff1a;数据库操作&#xff0c;文件操作&#xff0c;序列化数据&#xff0c;身份验证&#xff0c;框架开发&#xff0c;第三方库使用…

day41 动态规划part3

343. 整数拆分 中等 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 但是dp[0] 和 dp[1]为什么是0值得讨论&#xff0c;或者说不用讨论&#xff0c;压根…

加密与安全_PGP、OpenPGP和GPG加密通信协议

文章目录 PGPOpenPGPGPG工作原理工作流程用途案例说明过程 代码实现pom依赖PgpEncryptionUtilPgpDecryptionUtilCommonUtilsPgpEncryptionTest 小结 PGP PGP (Pretty Good Privacy) 是一种加密通信协议&#xff0c;用于保护电子邮件和文件的安全性和隐私。它通过使用加密、数字…

uni-app开发特点和开发流程

uni-app是一个基于Vue.js框架的跨平台应用开发框架&#xff0c;通过一套代码可以同时运行在多个平台上&#xff0c;包括iOS、Android、H5等。它采用了基于流布局的页面渲染机制&#xff0c;可以自动适配不同平台的屏幕尺寸和分辨率。uniapp官网&#xff1a;https://uniapp.dclo…

qt 汉字输出 中文输出 显示乱码 qDebug() 乱码 解决

要正确显示汉字&#xff0c;必须要先了解计算机文字编码相关知识&#xff0c;参考&#xff1a;unicode ucs2 utf16 utf8 ansi GBK GB2312 互转 及 渲染_ucs2编码转换-CSDN博客 1、汉字输出到 应用程序输出面板 qt 自定义的输出类qDebug() 、QDebug对象、QMessageLogger默认输…

用眼精星票证识别系统,轻松将户口本转成结构化Excel

眼精星票证识别系统是一款革命性的软件&#xff0c;它以高度的精准性和效率为特点&#xff0c;为用户提供了一个简单便捷的工具&#xff0c;将纸质户口本转化为结构化数据。这一创新技术不仅改变了传统数据录入的方式&#xff0c;还大大提高了工作效率&#xff0c;为用户节省了…

Buildroot 之二 详解构建架构、流程、external tree、示例

构建系统 Buildroot 中的构建系统使用的是从 Linux Kernel(4.17-rc2) 中移植的 Kconfig(配置) + Makefile & Kbuild(编译)这套构建系统,移植后的源码位于 support/kconfig/ 目录下。Buildroot 本身是一个构建系统,与直接编译源码不同,因此,它对这套系统进行了比较…

web服务器集群试题

服务器IP地址规划&#xff1a;client&#xff1a;12.0.0.12/24&#xff0c;网关服务器&#xff1a;ens36:12.0.0.1/24、ens33&#xff1a;192.168.11.1/24&#xff1b;Web1&#xff1a;192.168.11.10/24&#xff0c;Web2&#xff1a;192.168.11.11/24&#xff0c;Nginx&#xf…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Stack容器组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Stack容器组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Stack容器组件 堆叠容器&#xff0c;子组件按照顺序依次入栈&#xff0c;后一…

Yarn:Node.js依赖管理的现代选择

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

HTML5七天学会基础动画网页10(2)

制作立方体 学完前面的基础内容&#xff0c;制作立方体是个不错的练习方法&#xff0c;先看成品 再分析一下&#xff0c;六个面让每个面旋转平移就可以实现一个立方体&#xff0c;来看代码: <title> 制作立方体</title> <style> *{ margin: 0; padding: 0; …

Kotlin:枚举类

点击查看枚举类中文文档 点击查看枚举类英文文档 枚举类的最基本的用法是实现类型安全的枚举&#xff1a; enum class Direction {NORTH, SOUTH, WEST, EAST }每个枚举常量都是一个对象。枚举常量用逗号分隔。 初始化 因为每一个枚举都是枚举类的实例&#xff0c;所以他们可…

【HTML】div设为输入框,巧妙添加placeholder效果

效果图 文本撑满时 初始化时 码 contenteditable"true" 设为可编辑状态 <divcontenteditable"true"placeholder"评个小论吧&#xff01;"class"textarea"></div><style>/* 设置最小高度&#xff0c;超过滚动显示 …

Python 导入Excel三维坐标数据 生成三维曲面地形图(面) 3、线条平滑曲面但有条纹

环境和包: 环境 python:python-3.12.0-amd64包: matplotlib 3.8.2 pandas 2.1.4 openpyxl 3.1.2 scipy 1.12.0 代码: import pandas as pd import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from scipy.interpolate import griddata im…

操作系统:进程地址空间

目录 1.程序地址空间 1.1.程序地址空间的介绍 1.2.程序地址空间的本质 2.进程地址空间 3.Linux下的地址空间 1.程序地址空间 1.1.程序地址空间的介绍 我们在学习C/C时&#xff0c;对于各组分的地址分配在程序地址空间的不同模块 如图我们能够验证各组分的对应的地址排布位…

xss.haozi.me靶场“0x00-0x0A”通关教程

君衍. 一、靶场介绍二、第一关 0x00 不做限制三、第二关 0x01 文本闭合标签绕过四、第三关 0x02 双引号闭合绕过五、第四关 0x03 过滤括号六、第五关 0x04 编码绕过七、第六关 0x05 注释闭合绕过八、第七关 0x06 换行绕过九、第八关 0x07 删除标签十、第九关 0x08 多加空格绕过…