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 请求处理的关键部分。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Opencv 插值方法 总结

一、概括 面试的时候问到了一个图&#xff0c;就是如何将一个算子放缩&#xff1f;&#xff1f;我第一反应是resize&#xff08;&#xff09;,但是后来我转念一想&#xff0c;人家问的是插值方式&#xff0c;今天来总结一下 最邻近插值法原理分析及c实现_最临近插值法-CSDN博…

050-WEB攻防-PHP应用文件包含LFIRFI伪协议编码算法无文件利用黑白盒

050-WEB攻防-PHP应用&文件包含&LFI&RFI&伪协议编码算法&无文件利用&黑白盒 #知识点&#xff1a; 1、文件包含-原理&分类&危害-LFI&RFI 2、文件包含-利用-黑白盒&无文件&伪协议 演示案例&#xff1a; ➢文件包含-原理&分类&am…

解决达梦集成 JPA 时表和字段注释注解不生效的问题

前言 最近在做达梦数据库集成 JPA 时&#xff0c;发现使用的表注解和字段注解均未生效&#xff08;MySQL、Oracle、PostgreSQL中均可以在建表时正常生成相应的注释&#xff09;&#xff0c;经过调试发现解决办法也很简单&#xff1a; 自定义方言类继承自org.hibernate.dialect…

vue3 动态路由及使用动态路由后刷新界面出现空白页或者404

最近编写vue3动态路由的功能遇到了一些问题&#xff0c;处理好了&#xff0c;总结出来&#xff0c;希望能帮助到你。正片开始 先写好本地缓存菜单的方法&#xff08;存储、删除、获取&#xff09; // utils/menu.jsconst getMenuList () > {return JSON.parse(localStorag…

C语言——简易版扫雷

目录 前言 ​编辑 游戏规则 游戏结构的分析 游戏的设计 使用多文件的好处有以下几点&#xff1a; 游戏代码实现 框架&#xff08;test.c&#xff09; game函数&#xff08;test.c&#xff09; InitBoard初始化&#xff08;game.c&#xff09; Print打印棋盘&#xff08;g…

【物联网设备端开发】FastBee Arduino固件开发指南

目录 一、收集数据 二、打开FastBeeArduino 源码 三、修改 Config.cpp 文件 四、修改物模型数据 五、小程序配网 本文以 WeMOS D1 R1&#xff08;8266WIFI 模块&#xff09;固件开发为例&#xff0c;实现以下功能&#xff1a; 设备认证设备 Mqtt 交互Wifi 类设备配网 一…

vue学习笔记23-组件事件⭐

组件事件 在组件的模板表达式中&#xff0c;可以直接使用$emit方法触发自定义事件&#xff1b;触发自定义事件的目的是组件之间传递数据 好好好今天又碰到问题了&#xff0c;来吧来吧 测试发现其他项目都可以 正常的run ,就它不行 搜索发现新建项目并进入以后&#xff0c;用指…

搭建mysql主从复制(主主复制)

1&#xff1a;设主库允许远程连接(注意&#xff1a;设置账号密码必须使用的插件是mysql_native_password&#xff0c;其他的会连接失败) #切换到mysql这个数据库&#xff0c;修改user表中的host&#xff0c;使其可以实现远程连接 mysql>use mysql; mysql>update user se…

使用C#创建服务端Web API

前言 C# Web API 是一种基于 .NET 平台&#xff08;包括但不限于.NET Framework 和 .NET Core&#xff09;构建 HTTP 服务的框架&#xff0c;用于创建 RESTful Web 服务。REST&#xff08;Representational State Transfer&#xff09;是一种软件架构风格&#xff0c;它利用HT…

linux中查看目录文件(ls)用法:

查看目录下的文件&#xff1a;ls&#xff08;list&#xff09; 作用 查看目录下的内容 格式 ls -参数 操作对象参数 参数功能-l以长格形式显示文件和目录的详细信息,ls命令默认只显示名称的短格式。-d显示指定目录本身的信息,而不显示目录下的各个文件和子目录的信息。-…

【机器学习】机器学习是什么?用在哪里?怎么用?

1.机器学习是什么&#xff1f; 机器学习&#xff08;Machine Learning&#xff09;是人工智能的一个分支&#xff0c;它是一种通过对数据进行训练和学习&#xff0c;让计算机系统从中获取知识并改善性能的方法。简而言之&#xff0c;机器学习使计算机具有从数据中学习并自动改…

信息系统项目管理师009:消费互联网(1信息化发展—1.3现代化创新发展—1.3.3 消费互联网)

文章目录 1.3.3 消费互联网1.基本属性2.应用新格局 1.3.3 消费互联网 消费互联网是以个人为用户&#xff0c;以日常生活为应用场景的应用形式&#xff0c;满足消费者在互联网中的消费需求而生的互联网类型。消费互联网以消费者为服务中心&#xff0c;针对个人用户提升消费过程的…

机器学习模型—支持向量机 (SVM)

机器学习模型—支持向量机 (SVM) 支持向量机 (SVM) 是一种强大的机器学习算法,用于线性或非线性分类、回归,甚至异常值检测任务。SVM 可用于各种任务,例如文本分类、图像分类、垃圾邮件检测、笔迹识别、基因表达分析、人脸检测和异常检测。SVM 在各种应用中具有适应性和高效…

Github上哪些好用的工具

专注于web漏洞挖掘、内网渗透、免杀和代码审计&#xff0c;感谢各位师傅的关注&#xff01;网安之路漫长&#xff0c;与君共勉&#xff01; Qexo-爱写博客的师傅强烈推荐 漂亮的 Hexo 静态博客编辑器。该项目是基于 Django 的 Hexo 静态博客管理后台&#xff0c;支持文章管理、…

【Linux杂货铺】操作系统

目录 &#x1f308;前言&#x1f308; &#x1f4c1; 冯诺依曼体系结构 &#x1f4c2; 拓展问题&#xff1a;程序为什么要被加载到内存&#xff1f; &#x1f4c2; 主机与主机的交互 &#x1f4c1; 操作系统的概念 &#x1f4c2; 作用 &#x1f4c2; 理解“管理” &#x…

Hadoop学习3:问题解决

文章目录 问题解决1. ERROR: but there is no HDFS_NAMENODE_USER defined2. JAVA_HOME is not set and could not be found.3. Hadoop-DFS页面访问不了4. namenode格式化失败&#xff0c;或者dfs页面打开失败5. ERROR: but there is no YARN_RESOURCEMANAGER_USER defined. Ab…

YOLOv5独家改进:backbone改进 | 最新大卷积核CNN架构UniRepLKNet,ImageNet 88% | CVPR2024

💡💡💡本文独家改进:大核卷积一统多种模态!RepLK正统续作UniRepLKNet,代替YOLOv5 Backbone 改进结构图如下: 收录 YOLOv5原创自研 https://blog.csdn.net/m0_63774211/category_12511931.html 💡💡💡全网独家首发创新(原创),适合paper !!! 💡…

对于双列集合map的学习

双列集合 特点 1.双列集合一次需要存一对数据&#xff0c;分别是键和值。 2.键和值一一对应&#xff0c;键不能重复&#xff0c;值能重复。 3.键值这个整体我们称之为键值对或者键值对对象&#xff0c;在java中叫做Entry对象。 Map的常见API Map是双列集合的顶层接口&…

ChatGLM:基于ChatGLM-6B使用ptuning进行微调,实现类instruction的效果

由于业务需要&#xff0c;调研下怎么训练一个虚拟角色出来&#xff0c;所以找了一些文档参考&#xff0c;其中有一个基于ChatGLM-6B使用ptuning进行微调&#xff0c;实现类instruction的效果的现成的项目&#xff0c;给大家分享下。 一、介绍 由于ChatGLM-6B 不支持instructio…

五子棋小游戏(sut实验报告)

实验目的 实现人与人或人与电脑进行五子棋对弈 实验内容 启动游戏&#xff0c;显示游戏参数设置界面&#xff0c;用户输入参数后进入游戏界面&#xff0c;显示棋盘及双方博弈过程&#xff0c;游戏过程中可选择退出游戏。判定一方获胜后结束本局游戏&#xff0c;可选择继续下…