排名
6
文章
199
粉丝
4
评论
3
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:
50010702506256


欢迎加群交流技术

创建一个中间件实现图片防盗链
简单的就是直接判断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>();
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。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)
评价