Asp.Net Core 通过中间件防止图片盗链
2016-12-04 09:22
866 查看
一、原理
要实现防盗链,我们就必须先理解盗链的实现原理,提到防盗链的实现原理就不得不从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 = 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();
三、真能防?
如何突破防盗链?针对检查refer的方式,可以在页面中间件里面先进入目的地址的另外一个页面在转到目的页面即可,这样页面的refer就是目的站点自己的,如此,即做到突破。这方面可以使用的工具很多,尤其是成熟的web项目测试包,如HtmlUnit,直接在请求中设置refer都是可以的。
如果盗用网站是 https 的 protocol,而图片链接是 http 的话,则从 https 向 http 发起的请求会因为安全性的规定,而不带 referer,从而实现防盗链的绕过。
最后,我只能说这种方式,只能在一定程度上进行防御,不可能杜绝所有的攻击,还是建议使用成熟服务器应用的方案,比如Nginx。
原文地址:http://www.cnblogs.com/maxzhang1985/p/6124936.html
.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注
相关文章推荐
- asp.net MVC中获取当前URL/Controller/Action
- asp.net下webform的ReadOnly和Enabled属性最终渲染的结果
- 连接弹性和命令拦截的 ASP.NET MVC 应用程序中的实体框架
- ASP.NET MVC笔记
- asp.net手机网页横向适应屏幕
- ASP.NET MVC异步获取和刷新ExtJS6 TreeStore
- ASP.NET开发中主要的字符验证方法-JS验证、正则表达式、验证控件、后台验证
- ASP.NET MVC 异步获取和刷新ExtJS6 TreeStore
- Asp.net MVC中Html.Partial, RenderPartial, Action,RenderAction 区别和用法(mvc部分视图的添加)
- ASP.NET Core File Providers
- Asp.Net 如何获取所有控件&如何获取指定类型的所有控件
- 探索Aspnetcore+mysql+efcore
- 详解如何在ASP.NET Core中应用Entity Framework
- MvcPager 概述 MvcPager 分页示例 — 标准Ajax分页 对SEO进行优化的ajax分页 (支持asp.net mvc)
- 在Asp.net MVC使用jqGrid--代码少点再少点
- 简单的ASP.NET Forms身份认证
- 探索ASP.NET MVC5系列之~~~5.缓存篇(页面缓存+二级缓存)
- Asp.Net Mvc使用Autofac实现依赖注入
- 树莓派 Raspberry Pi 启用 root 登陆账户
- aspose.words生成word文档(.dox、.docx等)时,生成目录后,目录中的页码和实际页码不对应,代码中更新域都没用