Asp.Net Core 通过中间件防止图片盗链

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Asp.Net Core 通过中间件防止图片盗链相关的知识,希望对你有一定的参考价值。

一、原理


二、实现防盗链

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

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

 
   
   
 
  1. public class HotlinkingPreventionMiddleware

  2. {

  3.    private readonly string _wwwrootFolder;

  4.    private readonly RequestDelegate _next;

  5.    public HotlinkingPreventionMiddleware(RequestDelegate next, IHostingEnvironment env)

  6.    {

  7.        _wwwrootFolder = env.WebRootPath;

  8.        _next = next;

  9.    }

  10.    public async Task Invoke(HttpContext context)

  11.    {

  12.        var applicationUrl = $"{context.Request.Scheme}://{context.Request.Host.Value}";

  13.        var headersDictionary = context.Request.Headers;

  14.        var urlReferrer = headersDictionary[HeaderNames.Referer].ToString();

  15.        if(!string.IsNullOrEmpty(urlReferrer) && !urlReferrer.StartsWith(applicationUrl))

  16.        {

  17.            var unauthorizedImagePath = Path.Combine(_wwwrootFolder,"Images/Unauthorized.png");

  18.                

  19.            await context.Response.SendFileAsync(unauthorizedImagePath);

  20.        }

  21.            

  22.        await _next(context);

  23.    }

  24. }

 

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

  一般都要有一个IApplicationBuilder扩展:

 
   
   
 
  1. public static class BuilderExtensions

  2. {

  3.    public static IApplicationBuilder UseHotlinkingPreventionMiddleware(this IApplicationBuilder app)

  4.    {

  5.        return app.UseMiddleware();

  6.    }

  7. }

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

 
   
   
 
  1. app.UseHotlinkingPreventionMiddleware();


三、真能防?

 

  如果盗用网站是 https 的 protocol,而图片链接是 http 的话,则从 https 向 http 发起的请求会因为安全性的规定,而不带 referer,从而实现防盗链的绕过。

  最后,我只能说这种方式,只能在一定程度上进行防御,不可能杜绝所有的攻击,还是建议使用成熟服务器应用的方案,比如nginx


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

以上是关于Asp.Net Core 通过中间件防止图片盗链的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core 中间件基本用法

如何通过 Asp.Net Core 中间件的 JsonResult 响应?

php如何防止图片盗用/盗链的两种方法

写入自定义 ASP.NET Core 中间件

asp.net core 通过ajax上传图片及wangEditor图片上传

php如何防止图片盗用/盗链的两种方法(转)