一、原理
要实现防盗链,我们就必须先理解盗链的实现原理,提到防盗链的实现原理就不得不从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();
三、真能防?
如何突破防盗链?针对检查refer的方式,可以在页面中间件里面先进入目的地址的另外一个页面在转到目的页面即可,这样页面的refer就是目的站点自己的,如此,即做到突破。这方面可以使用的工具很多,尤其是成熟的web项目测试包,如HtmlUnit,直接在请求中设置refer都是可以的。
如果盗用网站是 https 的 protocol,而图片链接是 http 的话,则从 https 向 http 发起的请求会因为安全性的规定,而不带 referer,从而实现防盗链的绕过。
最后,我只能说这种方式,只能在一定程度上进行防御,不可能杜绝所有的攻击,还是建议使用成熟服务器应用的方案,比如Nginx。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持站长技术。
首先为大家提醒一点,.NET Core和经典.NET Framework的Library是不通用的,包括E...
hey guys 这不是也到了面试季了么cxuan 又打算重新写一下 Java 相关的面试题先从...
第二次日志 文章目录 第二次日志 前言 一、python语言基本元素 二、运算符 1、算...
Filmulator 是一个开源的具有库管理功能的 raw 照片编辑应用,侧重于简单、易用...
了解Redux Toolkit,这是用于高效Redux开发的经过验证的工具集。在本文中,你将...
Azkaban是什么? Azkaban是由Linkedin公司推出的一个批量工作流任务调度器,主要...
3 月 3 日消息 太阳谷更新将是 Windows 10 的大事件,现在这一点终于得到了微软...
% '****************************** '函数:IsObjInstalled(strClassString) '参...
看J2EE的时候,看见书上讲到使用cookie保存信息的时,看到书上举得例子都是英文...
简介 在企业级开发中、我们经常会有编写数据库表结构文档的时间付出,从业以来,...