WebDecoy/FCaptcha

GitHub: WebDecoy/FCaptcha

一款开源的自托管验证码系统,通过 40 余种行为信号、环境检测和 SHA-256 工作量证明来识别传统机器人、无头浏览器及新一代视觉 AI 代理。

Stars: 156 | Forks: 9

# F***Captcha **开源 CAPTCHA,通过单击甚至无需点击,即可拦截机器人、视觉 AI 代理和自动化程序。** ![License](https://img.shields.io/badge/license-MIT-blue.svg) ![Go](https://img.shields.io/badge/Go-1.21+-00ADD8?logo=go) ![Python](https://img.shields.io/badge/Python-3.12+-3776AB?logo=python) ![Node](https://img.shields.io/badge/Node-20+-339933?logo=node.js) ![Docker](https://img.shields.io/badge/Docker-ghcr.io-2496ED?logo=docker) **[试用在线演示](https://webdecoy.com/product/fcaptcha-demo/)** [![部署到 Render](https://render.com/images/deploy-to-render-button.svg)](https://render.com/deploy?repo=https://github.com/WebDecoy/FCaptcha) [![在 Railway 上部署](https://railway.com/button.svg)](https://railway.com/template?referralCode=webdecoy&template=https://github.com/WebDecoy/FCaptcha) FCaptcha 是一个现代 CAPTCHA 系统,旨在检测一切威胁:传统机器人、无头浏览器、自动化框架、CAPTCHA 农场,以及新一代基于视觉的 AI 代理。 ## 功能 - **单击或不可见** - 类似 Turnstile/reCAPTCHA v2 的复选框模式,或类似 reCAPTCHA v3 的不可见模式 - **视觉 AI 检测** - 专门针对截图→API→点击的自动化模式进行调优 - **工作量证明** - 服务器端验证的 SHA-256 挑战,强制攻击者付出计算成本 - **全面的机器人检测** - 检测无头浏览器、WebDriver、Puppeteer、Playwright、Selenium - **行为分析** - 超过 40 种信号,包括微震颤、速度方差、轨迹分析 - **撞库保护** - 表单交互分析、时间检测、程序化提交检测 - **自托管** - 无外部依赖,可在您自己的基础设施上运行 - **隐私优先** - 无持久性指纹识别,无跨站点跟踪 - **算法开源** - 评分透明,完全可审计 - **多语言服务端** - Go、Python 或 Node.js - 任您选择技术栈 ## 快速开始 ### Docker (推荐) 使用一条命令部署: ``` docker run -d -p 3000:3000 -e FCAPTCHA_SECRET=my-secret ghcr.io/webdecoy/fcaptcha ``` 这将为您提供: - API 地址为 `http://localhost:3000/api/*` - 客户端 JS 地址为 `http://localhost:3000/fcaptcha.js` - 演示页面地址为 `http://localhost:3000/demo/` 使用 Redis (用于分布式状态): ``` FCAPTCHA_SECRET=my-secret docker compose -f docker/docker-compose.yml up -d ``` 部署到 Fly.io: ``` fly launch --copy-config fly secrets set FCAPTCHA_SECRET=my-secret ``` 从源码构建: ``` docker build -f docker/Dockerfile -t fcaptcha . docker run -d -p 3000:3000 -e FCAPTCHA_SECRET=my-secret fcaptcha ``` ### 从源码运行 选择您的语言: **Go (最快)** ``` cd server-go go build -o fcaptcha-server FCAPTCHA_SECRET=your-secret ./fcaptcha-server ``` **Python (FastAPI)** ``` cd server-python pip install -r requirements.txt FCAPTCHA_SECRET=your-secret python server.py ``` **Node.js (Express)** ``` cd server-node npm install FCAPTCHA_SECRET=your-secret node server.js ``` ### 2. 添加到您的网站 **复选框模式 (交互式)** ```
``` **不可见模式 (零点击)** ``` ``` ### 3. 在您的后端进行验证 ``` // Go resp, _ := http.Post("https://your-server.com/api/token/verify", "application/json", strings.NewReader(`{"token": "...", "secret": "your-secret"}`)) var result map[string]interface{} json.NewDecoder(resp.Body).Decode(&result) if result["valid"].(bool) && result["score"].(float64) < 0.5 { // Valid request from human } ``` ``` # Python import requests result = requests.post('https://your-server.com/api/token/verify', json={'token': '...', 'secret': 'your-secret'} ).json() if result['valid'] and result['score'] < 0.5: # Valid request from human ``` ``` // Node.js const result = await fetch('https://your-server.com/api/token/verify', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ token: '...', secret: 'your-secret' }) }).then(r => r.json()); if (result.valid && result.score < 0.5) { // Valid request from human } ``` ## 工作原理 FCaptcha 跨多个类别收集信号: ### 工作量证明 (不可见层) 在任何验证之前,客户端必须解决一个 SHA-256 hashcash 挑战: - **页面加载时获取挑战** - 通过 Web Worker 在后台解决 - **非阻塞** - 用户完全无感知,计算在他们填写表单时进行 - **服务器端验证** - 一次性使用,防重放,签名挑战 - **难度动态调整** - 数据中心 IP 和高请求频率者会得到更难的谜题 - **强制计算成本** - 每次尝试需要大约 100-500 毫秒的 CPU 时间 这使得撞库的成本变得高昂:即使机器人通过了所有其他检查,它仍然会为每次尝试消耗计算资源。 ### 行为信号 (权重 40%) - 鼠标轨迹、速度、加速度曲线 - 微震颤检测 (人类在 3-25Hz 范围内有自然的手部抖动) - 点击精度和接近模式 - 点击前的探索行为 - 超调修正 - 直线比率检测 ### 环境信号 (权重 35%) - WebDriver/自动化框架检测 (Selenium、Puppeteer、Playwright、PhantomJS、Nightmare、Watir) - 无头浏览器指标 - Canvas/WebGL/Audio 指纹识别 - 插件和浏览器功能检查 - User-Agent 模式匹配 ### 时间信号 (权重 15%) - 工作量证明时间 (可揭示 API 往返延迟) - 交互时间模式 - 事件序列分析 - 从页面加载到交互的时间 ### 表单交互信号 (权重 10%) - 程序化 form.submit() 检测 - 从页面加载到提交的时间 - 提交前的事件 (无事件 = 机器人) - 文本区域键盘分析 (粘贴检测、打字速度、节奏) ## 视觉 AI 检测 现代 AI 代理的工作方式如下: 1. 截图 2. 发送至视觉 API (GPT-4V、Claude 等) 3. 获取点击坐标 4. 执行点击 这种模式具有可利用的特征: | 信号 | 人类 | 视觉 AI | |--------|-------|-----------| | 鼠标移动 | 自然曲线,微震颤 | 平滑/直线路径 | | 点击前行为 | 探索,犹豫 | 直接移向目标 | | 点击时机 | 可变,200-800ms | 一致,通常更快 | | 坐标精度 | 轻微方差 | 像素级精准 | | 工作量证明时间 | 与本地执行一致 | 因 API 往返而延迟 | ## API 参考 ### GET /api/pow/challenge 获取工作量证明挑战。客户端在页面加载时自动调用。 ``` // Request: GET /api/pow/challenge?siteKey=your-site-key // Response { "challengeId": "abc123...", "prefix": "abc123:1703356800000:4", "difficulty": 4, "expiresAt": 1703357100000, "sig": "def456..." } ``` 难度会根据以下因素动态调整: - 数据中心 IP:+1 难度 - 高请求频率:+1 难度 (最大为 6) ### POST /api/verify 验证复选框 CAPTCHA 提交。 ``` // Request { "siteKey": "your-site-key", "signals": { /* collected signals */ }, "powSolution": { "challengeId": "abc123...", "nonce": 68455, "hash": "0000abc..." } } // Response { "success": true, "score": 0.15, "token": "...", "recommendation": "allow" } ``` ### POST /api/score 获取不可见模式的评分。 ``` // Request { "siteKey": "your-site-key", "signals": { /* collected signals */ }, "action": "login", "powSolution": { "challengeId": "abc123...", "nonce": 68455, "hash": "0000abc..." } } // Response { "success": true, "score": 0.12, "token": "...", "action": "login" } ``` ### POST /api/token/verify 验证先前颁发的 token (服务端)。 ``` // Request { "token": "...", "secret": "your-secret" } // Response { "valid": true, "site_key": "your-site-key", "score": 0.15, "timestamp": 1703356800 } ``` ## 配置 ### 环境变量 | 变量 | 描述 | 默认值 | |----------|-------------|---------| | `FCAPTCHA_SECRET` | 用于 token 签名的密钥 | (必填) | | `PORT` | 服务器端口 | 3000 | | `REDIS_URL` | 用于分布式状态的 Redis URL | (内存中) | ### 评分阈值 | 分数 | 建议 | |-------|----------------| | < 0.3 | 放行 - 可能是人类 | | 0.3 - 0.6 | 挑战 - 不确定 | | > 0.6 | 拦截 - 可能是机器人 | ## 项目结构 ``` fcaptcha/ ├── client/ │ └── fcaptcha.js # Client-side widget, signal collection, PoW Web Worker ├── server-go/ │ ├── main.go # Go HTTP server + static file serving │ ├── scoring.go # Scoring engine + PoW verification │ ├── detection.go # IP reputation, header analysis, browser checks │ └── go.mod ├── server-python/ │ ├── server.py # Python/FastAPI server + PoW │ ├── detection.py # Detection modules │ └── requirements.txt ├── server-node/ │ ├── server.js # Node.js/Express server + PoW │ ├── detection.js # Detection modules │ └── package.json ├── test/ │ └── test-detection.js # Comprehensive test suite (50 tests) ├── demo/ │ └── index.html # Interactive demo page ├── docker/ │ ├── Dockerfile # Multi-stage build (Go binary + client + demo) │ └── docker-compose.yml # Docker compose with Redis ├── .github/workflows/ │ └── docker-publish.yml # GHCR publish on release ├── .dockerignore ├── ARCHITECTURE.md # Technical architecture documentation └── README.md ``` ## 开发 ``` # 运行 Go server cd server-go && go run . # 运行 Python server cd server-python && python server.py # 运行 Node server cd server-node && node server.js # 打开 demo open demo/index.html ``` ### 运行测试 ``` # 首先启动一个 server(任意语言) cd server-node && node server.js & # 运行 test suite node test/test-detection.js # 预期输出:50 个 tests,全部 passing ``` 测试套件涵盖: - 机器人 User-Agent 检测 (10 个测试) - 无头浏览器检测 (3 个测试) - 数据中心 IP 检测 (9 个测试) - HTTP 请求头分析 (3 个测试) - 浏览器一致性检查 (4 个测试) - 行为信号分析 (2 个测试) - 视觉 AI 检测 (3 个测试) - 表单交互分析 (6 个测试) - 工作量证明 (6 个测试) - Token 验证 (2 个测试) - 不可见模式评分 (2 个测试) ## 许可证 MIT 许可证 - 可自由使用,如果可以的话请贡献回馈。 **隐私说明**:FCaptcha 的设计充分考虑了隐私保护。无持久性指纹识别,无跨站点跟踪,不收集个人身份信息 (PII)。所有指纹均作用于会话范围,且仅用于机器人检测。
标签:AI代理检测, CAPTCHA, Docker, GNU通用公共许可证, Go, MITM代理, Node.js, Playwright检测, Puppeteer检测, Python, Ruby工具, Selenium检测, SHA-256, Web安全, 主机安全, 人机验证, 凭证填充保护, 反机器人, 反爬虫, 安全防御评估, 工作量证明, 开源, 微颤检测, 搜索引擎查询, 数据可视化, 无后门, 无头浏览器检测, 日志审计, 机器人检测, 网络安全, 自动化框架检测, 自定义脚本, 自托管, 蓝队分析, 请求拦截, 轨迹分析, 逆向工具, 隐私优先, 隐私保护, 验证码