一、原理
要实现防盗链,我们就必须先理解盗链的实现原理,提到防盗链的实现原理就不得不从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 |
|
最后,使用它只需要在Configure函数中调用,上面的扩展函数。
1 |
|
更多:
原文地址:https://www.cnblogs.com/tianma3798/p/9040346.html