.net core实现图片防盗链 电脑版发表于:2023/10/11 10:05 ### 创建一个中间件实现图片防盗链 简单的就是直接判断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; // 返回指定提示图片 } } ```