• Asp.Net Core 通过自定义中间件防止图片盗链的实例(转)


    一、原理

    要实现防盗链,我们就必须先理解盗链的实现原理,提到防盗链的实现原理就不得不从HTTP协议说起,在HTTP协议中,有一个表头字段叫referer,采用URL的格式来表示从哪儿链接到当前的网页或文件。换句话说,通过referer,网站可以检测目标网页访问的来源网页,如果是资源文件,则可以跟踪到显示它的网页地址。有了referer跟踪来源就好办了,这时就可以通过技术手段来进行处理,一旦检测到来源不是本站即进行阻止或者返回指定的页面。如果想对自己的网站进行防盗链保护,则需要针对不同的情况进行区别对待。

    如果网站服务器用的是apache,那么使用apache自带的Url Rewrite功能可以很轻松地防止各种盗链,其原理也是检查refer,如果refer的信息来自其他网站则重定向到指定图片或网页上。

    如果服务器使用的是IIS的话,则需要通过第三方插件来实现防盗链功能了,现在比较常用的一款产品叫做ISAPI_Rewrite,可以实现类似于apache的防盗链功能。另外对于论坛来说还可以使用“登录验证”的方法进行防盗链。

    二、实现防盗链

    现在让我们在ASP.NET Core中实现防盗链技术来保护我们的应用程序和站点文件。这就要通过ASP.NET Core中的中间件技术,监听并处理所有传入的请求,检查这些请求是不是来自我们的应用程序。

    让我们来创建这个防盗链的中间件程序:

        public class OuterImgMiddleware {
            private readonly string _wwwrootFolder;
            private readonly RequestDelegate _next;
    
            public OuterImgMiddleware(RequestDelegate next, IHostingEnvironment env)
            {
                _wwwrootFolder = env.WebRootPath;
                _next = next;
            }
    
            public async Task Invoke(HttpContext context)
            {
                var applicationUrl = $"{context.Request.Scheme}://{context.Request.Host.Value}";
                var headersDictionary = context.Request.Headers;
                var urlReferrer = headersDictionary["HeaderNamesReferer"].ToString();
    
                if (!string.IsNullOrEmpty(urlReferrer) && !urlReferrerStartsWith(applicationUrl))
                {
                    var unauthorizedImagePath = Path.Combine(_wwwrootFolder, "Images/Unauthorizedpng");
    
                    await context.Response.SendFileAsync(unauthorizedImagePath);
                }
                await _next(context);
            }
        }

    在这个中间件中我们可以看到ASP.NET Core中的Request对象并没有对Referrer进行封装,想获取Referrer,就要通过HTTP头信息(Headers)进行访问。

    一般都要有一个IApplicationBuilder扩展:

     
    1
    2
    3
    4
    5
    6
    7
    public static class BuilderExtensions
    {
      public static IApplicationBuilder UseHotlinkingPreventionMiddleware(this IApplicationBuilder app)
      {
        return appUseMiddleware();
      }
    }

    最后,使用它只需要在Configure函数中调用,上面的扩展函数。

    1
    app.UseHotlinkingPreventionMiddleware();

     

    更多:

  • 相关阅读:
    Java 插入排序
    Java 浮点型与双精度数值比较
    Java 包装类Integer的值比较
    ORA-00942 table or view does not exist
    logging模块
    面向对象
    模块和包
    异常处理
    序列化模块
    css3选择器
  • 原文地址:https://www.cnblogs.com/tianma3798/p/9040346.html
Copyright © 2020-2023  润新知