Asp.Net Core 通过中间件防止图片盗链
Posted dotNET跨平台
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Asp.Net Core 通过中间件防止图片盗链相关的知识,希望对你有一定的参考价值。
一、原理
二、实现防盗链
现在让我们在ASP.NET Core中实现防盗链技术来保护我们的应用程序和站点文件。这就要通过ASP.NET Core中的中间件技术,监听并处理所有传入的请求,检查这些请求是不是来自我们的应用程序。
让我们来创建这个防盗链的中间件程序:
public class HotlinkingPreventionMiddleware
{
private readonly string _wwwrootFolder;
private readonly RequestDelegate _next;
public HotlinkingPreventionMiddleware(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[HeaderNames.Referer].ToString();
if(!string.IsNullOrEmpty(urlReferrer) && !urlReferrer.StartsWith(applicationUrl))
{
var unauthorizedImagePath = Path.Combine(_wwwrootFolder,"Images/Unauthorized.png");
await context.Response.SendFileAsync(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 app.UseMiddleware();
}
}
最后,使用它只需要在Configure函数中调用,上面的扩展函数。
app.UseHotlinkingPreventionMiddleware();
三、真能防?
如果盗用网站是 https 的 protocol,而图片链接是 http 的话,则从 https 向 http 发起的请求会因为安全性的规定,而不带 referer,从而实现防盗链的绕过。
最后,我只能说这种方式,只能在一定程度上进行防御,不可能杜绝所有的攻击,还是建议使用成熟服务器应用的方案,比如nginx。
.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注
以上是关于Asp.Net Core 通过中间件防止图片盗链的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 Asp.Net Core 中间件的 JsonResult 响应?