TNBLOG
首页
博客
视频
资源
问答
猿趣
手机
关于
搜索
收藏
便签
笔记
消息
创作
登录
忆点点
情不知从何起,一往而情深
博主信息
排名
6
文章
6
粉丝
16
评论
8
文章类别
.net
35篇
.net core
15篇
cdn
1篇
云服务
1篇
前端
71篇
后端
6篇
随笔
19篇
架构
1篇
linux
6篇
git
3篇
virtualbox
1篇
app
1篇
英语
4篇
redis
4篇
docker
4篇
更多
mysql
6篇
sqlsugar
4篇
uni_app
4篇
数据库
1篇
最新文章
最新评价
{{item.articleTitle}}
{{item.blogName}}
:
{{item.content}}
关于我们
ICP备案 :
渝ICP备18016597号-1
网站信息:
2018-2024
TNBLOG.NET
技术交流:
群号656732739
联系我们:
contact@tnblog.net
欢迎加群
欢迎加群交流技术
原
.net core实现图片防盗链
930
人阅读
2023/10/11 10:05
总访问:
772708
评论:
0
收藏:
0
手机
分类:
.net core
### 创建一个中间件实现图片防盗链 简单的就是直接判断Referer ``` using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; namespace TNBLOG.Img.MyMiddleware { public class OuterImgMiddleware { private readonly RequestDelegate _next; private readonly IWebHostEnvironment _webHostEnvironment; public OuterImgMiddleware(RequestDelegate next, IWebHostEnvironment webHostEnvironment) { _webHostEnvironment = webHostEnvironment; _next = next; } public async Task Invoke(HttpContext context) { string url = context.Request.Path.Value; if (url.Contains(".jpg") || url.Contains(".png")) { string urlReferrer = context.Request.Headers["Referer"]; if (string.IsNullOrWhiteSpace(urlReferrer))//没有Referer就直接返回404 { // 为空也先走正常流程吧,不然浏览器里边直接访问图片地址也访问不到 await _next(context);//走正常流程 //await this.SetForbiddenImage(context, _webHostEnvironment);//返回404图片 } else if (!urlReferrer.Contains(".xx.net"))//非当前域名 { await this.SetForbiddenImage(context, _webHostEnvironment);//返回404图片 } else { await _next(context);//走正常流程 } } else { await _next(context);//走正常流程 } } /// <summary> /// 设置拒绝图片 /// </summary> /// <param name="context"></param> /// <returns></returns> private async Task SetForbiddenImage(HttpContext context, IWebHostEnvironment webHostEnvironment) { string defaultImagePath = webHostEnvironment.WebRootPath + "\\Error\\404.png"; string path = Path.Combine(Directory.GetCurrentDirectory(), defaultImagePath); FileStream fs = File.OpenRead(path); byte[] bytes = new byte[fs.Length]; await fs.ReadAsync(bytes, 0, bytes.Length); await context.Response.Body.WriteAsync(bytes, 0, bytes.Length); } } } ``` 然后把中间件引入进去即可 ``` app.UseMiddleware<OuterImgMiddleware>(); ``` tn2>refer是可以伪造的, 所以可以使用加密签名的方式来解决这个问题。 什么是加密签名?就是当我们请求一个图片的时候,我要给它带一些签名过去,然后返回图片的时候我们判断下签名是否正确,相当于对一个暗号。 ### 利用nginx实现图片防盗链 ``` location ~.*\.(gif|jpg|png|bmp|flv|swf|rar|zip)$ { valid_referers none blocked test.com *.test.com; // 加none的目的是确保浏览器可以直接访问资源 if($invalid_referer) { #return 403; // 直接返回403 rewrite ^/ http://www.xxx.com/403.jpg; // 返回指定提示图片 } } ```
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739
👈{{preArticle.title}}
👉{{nextArticle.title}}
评价
{{titleitem}}
{{titleitem}}
{{item.content}}
{{titleitem}}
{{titleitem}}
{{item.content}}