AI炼丹日志-27 - Anubis 通过 PoW工作量证明的反爬虫组件 上手指南 原理解析

article/2025/8/6 7:44:03

点一下关注吧!!!非常感谢!!持续更新!!!

Java篇:

  • MyBatis 更新完毕
  • 目前开始更新 Spring,一起深入浅出!

大数据篇 300+:

  • Hadoop(已更完)
  • HDFS(已更完)
  • MapReduce(已更完)
  • Hive(已更完)
  • Flume(已更完)
  • Sqoop(已更完)
  • Zookeeper(已更完)
  • HBase(已更完)
  • Redis (已更完)
  • Kafka(已更完)
  • Spark(已更完)
  • Flink(已更完)
  • ClickHouse(已更完)
  • Kudu(已更完)
  • Druid(已更完)
  • Kylin(已更完)
  • Elasticsearch(已更完)
  • DataX(已更完)
  • Tez(已更完)
  • 数据挖掘(已更完)
  • Prometheus(已更完)
  • Grafana(已更完)
  • 离线数仓(已更完)
  • 实时数仓(正在更新…)
  • Spark MLib (正在更新…)

在这里插入图片描述

基本介绍

官方地址

https://anubis.techaro.lol/docs/design/why-proof-of-work

在这里插入图片描述

核心理念

Anubis 采用类似于区块链挖矿的机制 —— Proof-of-Work(工作量证明),通过要求访问者在请求前完成一定的计算任务,来有效阻止自动化爬虫脚本对网站内容的抓取。

对人类用户几乎无感,但会显著增加爬虫成本和请求延迟。

官方介绍

Anubis 会“称量”你连接的“灵魂”,通过一道工作量证明(PoW)挑战,来保护上游资源不被爬虫程序滥用。
● PoW 机制:访问网页前必须完成一次 SHA256 Hash-based 运算(需要找到一个 nonce 使得哈希值满足某种前缀条件)
● 轻量无状态部署:可直接作为中间件接入 Web 项目,无需数据库
● 防御方式灵活:可配置访问频率限制、黑名单、白名单机制
● 兼容性强:可作为反向代理层组件使用,也可以集成进 Flask、Express、NGINX 等中间件架构
● 自定义难度:支持配置计算任务难度,适配不同的网络环境和安全需求
● 对正常用户影响小:支持 JS + WebAssembly 实现快速计算,首次验证后会缓存通行令牌,减少重复计算

应用场景

● 网站防爬(不依赖验证码)
● 对抗恶意扫描、暴力破解尝试
● 保护公开 API 接口免于被批量滥用
● 替代或增强 CAPTCHA 的轻量解决方案

工作流程

● 用户请求页面 → 被拦截
● 服务器返回 PoW 挑战(如:哈希前缀为 00000)
● 浏览器或客户端完成计算,返回答案(nonce)
● 验证通过后颁发访问令牌,后续访问直接放行

安装项目

克隆项目

git clone https://github.com/TecharoHQ/anubis.git

克隆后进入项目:
在这里插入图片描述

构建项目

我们使用 make 编译:

make

需要耐心等待:
在这里插入图片描述
如果顺利编译结束可以看到:
在这里插入图片描述

测试项目

编译完成之后,我们可以通过配置参数来进行配置:

./var/anubis -target http://localhost:8888 -use-remote-address

需要解释一下:
● -target 就是做完 PoW 校验之后,要转发到的地址
● -use-remote-address 如果你不配置该参数,你需要通过 NGINX->Anubis->你的服务,需要转发才可以。这种适合本地测试,如果上线的话,则去掉。

运行之后,可以看到正常输出了日志:
在这里插入图片描述

当中比较重要的内容,主要是服务的地址、目标服务的地址、计算难度等内容:

{"time": "2025-05-10T09:54:46.832563+08:00","level": "INFO","source": {"function": "main.main","file": "/Users/wuzikang/Desktop/github/anubis/cmd/anubis/main.go","line": 323},"msg": "listening","url": "http://localhost:8923","difficulty": 4,"serveRobotsTXT": false,"target": "http://localhost:8888","version": "devel","use-remote-address": true,"debug-benchmark-js": false,"og-passthrough": false,"og-expiry-time": 86400000000000,"base-prefix": "","cookie-expiration-time": 604800000000000,"rule-error-ids": {"ai-robots-txt": "8e399aa8f9f5d95a8cd0ad01284ea904784a854e9c6ab17ac9994f479d18aaed","cloudflare-workers": "559e7f01707b78efda8b0ed791e13d0e0079fbf0e3c81c8dfaf2299537f8b666","deny-aggressive-brazilian-scrapers": "c6664788c65ba3a1fbc2df151564b216b65a05a6828f94c63e1226c4d971cfca","headless-chrome": "b2dd0d54fa37a160ed04d152bcdde5df296a5861e0a6ef6a4fe845ef51d93be0","headless-chromium": "900a0b88e9bcd4ae0772b55c198f6fb9e0e352da8af4ed61f7f72df1391f85a2","lightpanda": "8c4f381bde0fabcd361c88ec7f015d981fd7f80f3edcb16e670ed0bc772eb62d","us-artificial-intelligence-scraper": "5f0cb91e78d0499d22892c79e1520ccb378e98d3836effbd1ad675721bd46ac1"}
}

访问项目:
http://localhost:8923

我们访问之后,可以看到需要先进行一个 PoW 的计算,计算通过后才会转发到对应的地址上:

在这里插入图片描述

简易分析

工作原理

如下图所示:

在这里插入图片描述
主要是进行一个 SHA-256 的计算,比如要求客户端算出一个开头是 “0000” 的值才可以,那客户端会进行 SHA-256 的多次计算,直到结果的开头是:“0000” 则结束。

当然,这个计算并不会每次都进行,不然如果一个页面反复计算的话,也会给用户带来很不好的体验。
所以当客户端通过计算之后,会在 HTTP 的 Cookie 中加一个: “within.website-x-cmd-anubis-auth”,当中的内容用的是 JWT实现的,当中含有的内容有:
● challenge:根据用户请求的元数据生成的挑战字符串
● nonce:用于生成通过验证结果的 nonce 值(即迭代次数)
● response:通过 Anubis 校验的哈希值(计算结果)
● iat(Issued At):令牌的签发时间
● nbf(Not Before):令牌的生效时间,通常是签发时间的前一分钟
● exp(Expiration):令牌的过期时间,通常是签发后一周

为什么用SHA-256

PS:来自官方的解释
Anubis 使用工作量证明(Proof of Work)机制来验证客户端是否为真实用户。
其灵感来源于 Hashcash,这是 2000 年代初提出的一种方案,旨在通过扩展电子邮件协议来防止垃圾邮件。

这个想法的核心是:
真实用户在发送邮件前需要完成一个小型的数学问题,比如 对一个字符串进行哈希运算,使结果具有指定数量的前导零。
这种计算 对个人用户来说开销很小(一周发几封邮件几乎无影响),
但对于那些 大规模发送广告邮件的公司来说,这样的计算代价会变得非常高昂,起到抑制作用。

这种机制的原理,实际上也是 比特币共识算法(挖矿) 的基础。


http://www.hkcw.cn/article/uOfcbbnhjZ.shtml

相关文章

WEBSTORM前端 —— 第3章:移动 Web —— 第4节:移动适配-VM

目录 一、适配方案 二、VM布局 ​编辑 三、vh布局 四、案例—酷我音乐 一、适配方案 二、VM布局 三、vh布局 四、案例—酷我音乐

AI:使用 Keras 实现线性回归模型

🌟从零开始:使用 Keras 实现线性回归模型(附完整代码 + 可视化教程)🔢📈 ✨线性回归是机器学习中的“Hello World”,适合新手入门。本文将通过一个完整的实战案例,带你使用 TensorFlow Keras 搭建一个线性回归模型,并对训练与预测结果进行可视化分析。 📎 本文亮…

TDengine 基于 TDgpt 的 AI 应用实战

基于 TDgpt 时序数据智能体的风力发电预测 作者: derekchen Demo 数据集准备 我们使用公开的UTSD数据集里面的某风场发电数据,作为预测算法的数据来源,基于历史数据预测未来一天内的每15分钟的发电量。原始数据集的采集频次为4秒&#xff…

模拟实现线程池(线程数目为定值)和定时器

前言 昨天学习关于定时器的相关知识。今天花时间去模拟实现了一个定时器,同时也去模拟实现了一个线程池(线程数目为定值)。我感觉我收获了很多,对于线程的理解加深了。跟大家分享一下~ 线程池和定时器(这个是主要)的实现 代码 线程池 import java.ut…

JMeter 性能测试

1.定时器 1.1 同步定时器 作用:阻塞线程使同时达到n个线程之后再发出请求,模拟高并发的场景。 路径:右键请求--添加--定时器--Synchronizing Timer 2.2 常数吞吐量定时器 作用:模拟服务器负载,即需要服务器以一个固定…

通俗易懂的 JS DOM 操作指南:从创建到挂载

目录 🧩 1. 创建元素:document.createElement / createElementNS 📝 2. 创建文本:document.createTextNode ✏️ 3. 修改文本:node.nodeValue 🗑️ 4. 移除元素:el.removeChild() &#x1…

串口通信技术及USART应用研究

串口通信技术及USART应用研究 # 串口通信技术及USART应用研究 摘要:本文深入探讨了串口通信技术的基本原理、硬件电路设计以及USART(通用同步/异步收发器)在STM32微控制器中的应用。首先对通信接口进行了概述,分析了不同通信协议…

OneRef论文精读(补充)

接上篇:OneRef论文精读 The five referring datasets 这些数据集应用于指代表达式理解(REC)、短语定位(PG)及指代表达式分割(RES)任务。表8列出了详细的统计数据。 RefCOCO/RefCOCO/RefCOCOg&…

vscode 代理模式(agent mode),简单尝试一下。

1. 起因, 目的: agent mode, 很流行,名气很大。简单试试效果,确实很强。agent mode, 取代人工,确实是前进了一大步。 2. 先看效果 效果对比,左边是 普通的AI 生成的, 右边是 代理…

Scratch节日 | 六一儿童节抓糖果

六一儿童节怎么能没有糖果?这款 六一儿童节抓糖果 小游戏,让你变身小猫,开启一场甜蜜大作战! 🎮 游戏玩法 帮助小猫收集所有丢失的糖果,收集越多分数越高! 小心虫子一样的“坏糖果”&#xff…

【Linux系统】第八节—进程概念(上)—冯诺依曼体系结构+操作系统+进程及进程状态+僵尸进程—详解!

hi,我是云边有个稻草人 偶尔中二的博主^(* ̄(oo) ̄)^,与你分享专业知识,祝博主们端午节快乐! Linux—本节博客所属专栏—持续更新中—欢迎订阅! 目录 一、冯诺依曼体系结构 二、操作系统(Opera…

告别手动绘图!基于AI的Smart Mermaid自动可视化图表工具搭建与使用指南

以下是对Smart Mermaid的简单介绍: 一款基于 AI 技术的 Web 应用程序,可将文本内容智能转换为 Mermaid 格式的代码,并将其渲染成可视化图表可以智能制作流程图、序列图、甘特图、状态图等等,并且支持在线调整、图片导出可以Docke…

PCB设计教程【强化篇】——USB拓展坞PCB布局

前言 本教程基于B站Expert电子实验室的PCB设计教学的整理,为个人学习记录,旨在帮助PCB设计新手入门。所有内容仅作学习交流使用,无任何商业目的。若涉及侵权,请随时联系,将会立即处理 目录 前言 一、前期准备与板框…

EC11旋转编码器,Versatile_RotaryEncoder库详解

旋转编码器与电位器 旋转编码器是电位器的现代数字等效物,并且用途更广泛。 旋转编码器可以不停地旋转360,而电位器只能旋转3/4圈。 电位器用于需要知道旋钮准确位置的情况。另一方面,旋转编码器用于需要知道位置变化而不是确切位置的情况…

【金融基础学习】债券回购方式

债券回购作为货币市场的重要工具,本质上是一种以债券为抵押的短期资金借贷行为。在银行间市场,质押式回购与**买断式回购*是两种主要形式。 1. 质押式回购(Pledged Repo, RP) – 所有权不转移的短期融资工具 1.1 质押式回购概述 质押式回购是交易双方…

助力高校AI教学与科研:GpuGeek推出618算力支持活动

618期间,GpuGeek推出面向高校师生的专属算力支持计划,6月5日至25日活动期间,完成学生认证的用户充值即可获得"学霸礼包",同时平台算力嘉年华活动还将为用户提供额外算力赠送,有效降低了AI学习与研究的资源门…

多线程( Thread)

线程:是一个程序内部的一条执行流程。 多线程:是指从软硬件上实现的多条执行流程的技术(多条线程由CPU负责调度执行)。 创建线程: 多线程的创建方式之一:继承Thread类 1.定义一个子类MyThread继承线程类…

Vue-2-前端框架Vue基础入门之二

文章目录 1 计算属性1.1 计算属性简介1.2 计算属性示例 2 侦听器2.1 简单的侦听器2.2 深度监听2.3 监听对象单个属性 3 vue-cli3.1 工程化的Vue项目3.2 Vue项目的运行流程 4 vue组件4.1 Vue组件的三个部分4.1.1 template4.1.2 script4.1.3 style 4.2 组件之间的关系4.2.1 使用组…

LTSPICE仿真电路:(三十二)差动放大器电流源

1.差动放大器电流源 本来是和HOWLAND电流源在一起的,后面想着以后不一定好查找,不如重新另起一篇算了,和前一章的电流源有比较接近的地方,四个电阻直接变成差动放大器内部的东西。 方框中的就是差动放大器,也是负反馈…

Redis 缓存穿透、缓存击穿、缓存雪崩详解与解决方案

在分布式系统中,Redis 凭借高性能和高并发处理能力,成为常用的缓存组件。然而,在实际应用中,缓存穿透、缓存击穿、缓存雪崩这三大问题会严重影响系统的性能与稳定性。本文将详细解析这三个问题的成因,并提供对应的解决…