< 返回技术文档列表

Asp.Net Core 中怎么利用中间件防止图片盗链

发布时间:2021-09-01 03:39:10⊙投诉举报

今天就跟大家聊聊有关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 HotlinkingPreventionMiddleware
{
  private readonly string _wwwrootFolder;
  private readonly RequestDelegate _next;

  public HotlinkingPreventionMiddleware(RequestDelegate next, IHostingEnvironment env)
  {
    _wwwrootFolder = envWebRootPath;
    _next = next;
  }

  public async Task Invoke(HttpContext context)
  {
    var applicationUrl = $"{contextRequestScheme}://{contextRequestHostValue}";
    var headersDictionary = contextRequestHeaders;
    var urlReferrer = headersDictionary[HeaderNamesReferer]ToString();

    if(!stringIsNullOrEmpty(urlReferrer) && !urlReferrerStartsWith(applicationUrl))
    {
      var unauthorizedImagePath = PathCombine(_wwwrootFolder,"Images/Unauthorizedpng");
        
      await contextResponseSendFileAsync(unauthorizedImagePath);
    }
      
    await _next(context);
  }
}

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

一般都要有一个IApplicationBuilder扩展:

public static class BuilderExtensions
{
  public static IApplicationBuilder UseHotlinkingPreventionMiddleware(this IApplicationBuilder app)
  {
    return appUseMiddleware();
  }
}

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

app.UseHotlinkingPreventionMiddleware();

看完上述内容,你们对Asp.Net Core 中怎么利用中间件防止图片盗链有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注血鸟云行业资讯频道,感谢大家的支持。


/template/Home/Zkeys/PC/Static