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();

 

 

更多:

posted @ 2018-05-15 12:13  天马3798  阅读(627)  评论(0编辑  收藏  举报