
网络安全应用安全后端【免费下载链接】capFree, open-source and self-hosted CAPTCHA alternative to reCAPTCHA. Privacy-first and powered by proof-of-work and instrumentation challenges.项目地址https://gitcode.com/gh_mirrors/cap13/cap点击查看免费下载Cap Standalone 是 Cap 项目官方推荐的自托管后端方案它运行在 Bun 上空闲内存约 50 MB内置基于 JavaScript instrumentation 的 challenge可大幅提高机器人破解门槛、与 reCAPTCHA 兼容的 siteverify API以及用于管理多个 site key 的 Web 仪表盘。读完本文你将掌握从 Docker 部署、创建 site key、接入前端cap-widget到后端siteverify校验 token 的完整链路并了解 CORS、限流、健康检查、HashWX 证明工作量proof-of-work等生产级配置项。全文以仓库中的 Standalone 快速入门泰语版及其姊妹篇 options.md 为骨架并对照 standalone/src 下的源码逐一印证。Cap Standalone 是什么Cap Standalone 是 Cap 自托管后端的一体化发行形态核心能力集中在三点以 Bun 为运行时容器空闲内存占用约 50 MB适合低成本 VPS 部署内置 instrumentation challenge新创建的 site key 默认开启。它通过 JavaScript 混淆与浏览器行为检测显著抬高自动化破解成本提供 reCAPTCHA 兼容的 siteverify API与 Web 仪表盘仪表盘用于创建 site key、配置 challenge 协议、查看统计与限流设置。对应的完整服务端实现位于 standalone/src/index.js它基于 Elysia 框架组装了 Swagger 文档、CORS、健康检查、认证、Keys/Settings 管理 API、挑战生成capServer、siteverify 校验与静态资源等服务。入口监听SERVER_PORT默认 3000与SERVER_HOSTNAME默认0.0.0.0并注册了SIGTERM/SIGINT优雅关闭逻辑。使用 Docker 安装官方推荐用 Docker 运行 Cap Standalone。新建docker-compose.ymlservices: cap: image: tiago2/cap:latest container_name: cap ports: - 3000:3000 environment: ADMIN_KEY: your_secret_password REDIS_URL: redis://valkey:6379 depends_on: valkey: condition: service_healthy restart: unless-stopped valkey: image: valkey/valkey:9-alpine container_name: cap-valkey volumes: - valkey-data:/data command: valkey-server --save 60 1 --loglevel warning --maxmemory-policy noeviction healthcheck: test: [CMD, valkey-cli, ping] interval: 5s timeout: 3s retries: 5 restart: unless-stopped volumes: valkey-data:启动容器docker compose up -d实用提示来自官方指南ADMIN_KEY是仪表盘的登录凭据建议长度至少 32 个字符若宿主机 3000 端口已被占用修改ports的映射即可如果仪表盘无法访问可尝试在cap服务下加network_mode: host。随后访问http://localhost:3000或服务器的 IP/域名加 3000 端口进入仪表盘用 admin key 登录创建一个 site key并记下site key与对应的secret key——接入时两者都需要。新 key 默认开启 instrumentation challenge官方建议保持开启因为它显著提高机器人破解难度你还可以在 key 设置中额外打开 headless 浏览器检测对应源码中的blockAutomatedBrowsers配置。一个重要的部署前提实例必须能从公网访问widget 才能与之通信。若使用反向代理务必按 options.md 配置好限流与转发头详见下文客户端 IP 与反向代理小节。仓库根目录还提供了可直接运行的 standalone/docker-compose.yml 与 Dockerfile 供参考。创建 site key 的底层逻辑从源码看创建 key 的 API 是POST /server/keysstandalone/src/server.jssite key 由 5 字节随机数生成十六进制串secret key 以sk-前缀开头、由 32 字节随机数 Base64 生成secret 在 Redis 中只存 SHA-256 哈希secretHash见 secret-hash.jsJWT 挑战密钥单独保存。每个 key 的配置由keyDefaultsserver.js给出默认值配置项默认值含义protocolhashwx默认挑战协议抗 GPU 的 proof-of-workhashwxDifficulty1_000_000HashWX 预期哈希次数instrumentationfalse仪表盘创建时按需开启是否启用 JS instrumentation challengeobfuscationLevel3instrumentation 混淆等级1–10blockAutomatedBrowsersfalse是否拦截 headless 浏览器difficulty/challengeCount4/80SHA-256 PoW 的难度与挑战数legacy 协议rsw/rswTfalse/75_000是否使用 RSW 与时间锁参数 t客户端接入把 widget 指向你的实例在前端用data-cap-api-endpoint属性把cap-widget指向实例https://instance_url/site_key/其中instance_url是实例的公网 URLsite_key是仪表盘创建的 site key。示例cap-widget>curl https://instance_url/site_key/siteverify \ -X POST \ -H Content-Type: application/json \ -d { secret: key_secret, response: captcha_token }key_secret是仪表盘里该 site key 对应的secret key不是仪表盘的 admin keycaptcha_token是 widget 生成的 challenge token。校验通过时返回{ success: true }siteverify 源码级细节对照 standalone/src/siteverify.js 可以看到几个值得注意的实现事实路径可选 site keyPOST /:siteKey?/siteverify允许 site key 出现在路径中也可以只出现在 token 里。token 格式为siteKey:redeemId:redeemSecret冒号分隔三段源码通过response.split(:).length ! 3做初步校验若路径带了 site key还会要求 token 以其开头否则返回 404。一次性消费token 以token:response为键存于 Redis校验时用GETDEL原子取出——因此同一 token 只能成功验证一次重复提交会返回 404Token not found。过期校验token 存储的是到期时间戳若早于当前时间则返回 403Token expired。token 默认 TTL 2 小时由 cap.js 的TOKEN_TTL_MS决定。secret 校验secret 与 Redis 中的secretHash比对secret-hash.js失败返回 403若发现旧格式哈希会在成功后自动升级为 SHA-256。siteverify 不限流它被设计为服务器到服务器的调用默认不受限流约束限流只作用于 challenge 端点。生产级配置项详解以下配置均来自 options.md并对照源码给出实现依据。CORS通过环境变量CORS_ORIGIN设置 challenge 请求的默认 CORS 允许来源默认*允许所有 origin多个域名用逗号分隔如domain1.tld,domain2.tld。此外也可以在仪表盘Settings CORS中配置对应PUT /settings/cors。CORS 中间件见 index.js/assets路径始终放行其余路径交由checkCorsOrigin判断每 key 也可以配置自己的corsOrigins白名单覆盖全局。客户端 IP 与反向代理限流challenge 端点按客户端 IP 做固定时间窗口限流默认30 次请求 / 5 秒。超过限额返回429并带响应头X-RateLimit-Remaining: 0。全局限额可在仪表盘Settings调整或通过PUT /settings/ratelimit取值范围max1–10000、duration1000–3600000 ms也支持在单个 key 的Configuration标签页按 key 覆盖对应 key 配置中的ratelimitMax/ratelimitDuration。Standalone 识别客户端 IP 时依次检查X-Forwarded-For、X-Real-IP、CF-Connecting-IP头最后回退到 socket 地址见 cap.js 与 ratelimit.js。若反向代理使用其他头可设置RATELIMIT_IP_HEADER环境变量或在仪表盘Settings Headers中配置ipHeader如 Cloudflare 用户可设为cf-connecting-ip。务必让代理转发真实客户端 IP。nginx 参考配置location / { proxy_pass http://localhost:3000; proxy_set_header X-Forwarded-For $remote_addr; }否则所有请求看起来都来自代理 IP全站共用一个限流配额桶。同时注意X-Forwarded-For是信则用因此不要让服务器直接暴露于公网不经过可信代理否则客户端可伪造头绕过限流。Redis / Valkey 存储Cap Standalone 的所有数据都存于 Redis或其兼容替代 Valkey。设置REDIS_URL为你的连接串默认redis://localhost:6379。官方推荐通过上面的 docker-compose 使用 Valkey 9Redis 兼容支持--save 60 1持久化与健康检查。如果多个 Cap 实例或与其他应用共享同一个 Redis用REDIS_PREFIX隔离命名空间例如REDIS_PREFIXcap:会让 session 键变为cap:session:...、metric 键变为cap:metrics:...默认留空对存量系统无影响。健康检查与优雅关闭Standalone 提供两个免认证端点供编排系统探活GET /healthRedis 在 2 秒内应答PING返回200 {status:ok}否则503 {status:unavailable}用于 readiness 探针与告警GET /health/live只要进程存活就返回200即使 Redis 宕机用于 liveness 探针避免 Redis 故障期间编排系统反复重启 Cap。实现见 standalone/src/health.js1 秒内的多次探活复用同一次PING因此频繁调用不会压垮 Redis。Kubernetes 示例readinessProbe: httpGet: path: /health port: 3000 livenessProbe: httpGet: path: /health/live port: 3000Docker Compose 下可给cap服务加如下 healthcheck纯 Docker 只标记 unhealthy不会自动重启healthcheck: test: [CMD, bun, -e, fetch(http://127.0.0.1:3000/health).then((r) process.exit(r.ok ? 0 : 1)).catch(() process.exit(1))] interval: 30s timeout: 5s retries: 3收到SIGTERM/SIGINT时Cap 会停止接受新连接、等待在途请求完成、关闭 Redis 并以码 0 退出若 8 秒后仍有在途请求则立即以码 1 退出因此总能落在 Docker 默认 10 秒停机窗口内收到第二个信号则立即退出。对应 index.js 中的SHUTDOWN_TIMEOUT_MS 8_000逻辑。错误信息错误信息默认被遮蔽并记录到控制台。DISABLE_ERROR_LOGGINGtrue可关闭错误日志SHOW_ERRORStrue可关闭遮蔽在响应中暴露detail。从 index.js 看被遮蔽的错误响应会带一个随机id与排障链接便于对照日志定位。Asset server自托管 widget 与 WASM 文件默认关闭设置ENABLE_ASSETS_SERVERtrue后由/assets端点提供静态文件。生产环境务必用WIDGET_VERSION与WASM_VERSION固定版本默认latest不推荐可能引入破坏性变更。版本取自 npm 上cap.js/widget与cap.js/wasm的 release。示例ENABLE_ASSETS_SERVERtrue WIDGET_VERSION0.1.58 WASM_VERSION0.0.8文件路径如下/assets/widget.js/assets/floating.js/assets/cap_wasm_bg.wasm/assets/hashwx.wasm/assets/cap_wasm.js接入方式见 options.mdscript srchttps://server url/assets/widget.js/script浮动模式用script srchttps://server url/assets/floating.js/script并设置window.CAP_CUSTOM_WASM_URL https://server url/assets/cap_wasm_bg.wasm; window.CAP_CUSTOM_HASHWX_URL https://server url/assets/hashwx.wasm;注意hashwx.wasm自cap.js/wasm0.0.8 起才存在若WASM_VERSION更旧/assets/hashwx.wasm会返回 503此时不要设置CAP_CUSTOM_HASHWX_URLwidget 会自行从 jsdelivr 加载。实现细节standalone/src/assets.js文件在启动时从CACHE_HOST默认https://cdn.jsdelivr.net可用同名环境变量覆盖拉取进 Redis 缓存之后每小时刷新、每天强制更新。若端点返回Asset not cached yet依次检查容器内是否真的设置了ENABLE_ASSETS_SERVERtrue未设置时/assets/*返回 404 并说明被禁用容器能否访问CACHE_HOST下载失败时启动日志出现[asset server] failed to update assets cache每小时重试WIDGET_VERSION/WASM_VERSION是否指向 npm 上真实存在的版本。HashWX默认的抗 GPU 证明工作量协议Cap Standalone 以 HashWX 作为新 key 的默认 challenge 协议该协议按 key 独立设置不同 key 可以分别使用 SHA-256 或 HashWX在 HashWX 上线前创建的 key 保持原有协议除非手动切换。切换位置在 key 的Configuration标签页的Challenge protocol。HashWX 无需生成或保存任何密钥对。难度由HashWX difficulty滑块控制即预期客户端需执行的哈希次数默认1_000_000拆分为四道子挑战官方实测在 8 核桌面 Chrome 上中位耗时约 578 ms手机上约 1.1–5.9 秒调高前建议参考 HashWX 文档的手机实测。合法范围50_000–5_000_000与 server.js 的校验一致。无 WebAssembly 的客户端无法求解 HashWX。如需兼容可把该 key 切换为 SHA-256 PoW有纯 JS 回退路径。RSW 时间锁谜题仍可对存量系统选用但已被弃用GPU 解它的速率约比 CPU 快 170 倍无法提供当初设计时预期的抗 GPU 能力。RSW difficulty设置参数t连续平方次数范围10_000–300_000RSW_BITS2048覆盖启动时的模数位数。源码层面cap.js 根据resolveProtocol(keyConfig)决定 challenge 选项HashWX 时传hashwxDifficulty并做边界钳制50_000–5_000_000RSW 时需先确保 keypair 就绪SHA-256 时使用challengeCount/saltSize/difficulty。widget 会自动从数据格式识别协议因此切换 key 是你唯一需要做的事而 Standalone 之外cap-core 默认仍是 SHA-256 PoW除非显式开启其他协议。instrumentation challenge 等级instrumentation challenge 默认对新建 site key 开启可在 key 设置页开关要拦截 headless 浏览器则打开Attempt to block headless browsers对应blockAutomatedBrowsers。等级越高正常用户的转化率损失越大官方建议保持在等级 3若觉得等级 3 太慢等级 1 在单核上会快得多。这一默认值与 server.js 中obfuscationLevel: 3的默认值一致。当 instrumentation 校验失败时redeem 端点会返回instr_error: true与具体原因corrupted/expired/automated_browser_detected/timeout 等见 cap.js便于区分正常用户失败与机器人被拦截。可选的 IP 数据库国家与 ASN仪表盘Settings IP Data Country ASN data支持三家可切换的提供商DB-IP Lite、MaxMind GeoLite2、IPInfo API。DB-IP 与 MaxMind 的.mmdb文件会下载到容器内/usr/src/app/data/。由于容器以非特权用户bunUID 1000运行如果 bind-mount 宿主机目录到/usr/src/app/data该目录必须对 UID 1000 可写否则下载报EACCES: permission deniedmkdir -p ./cap-data sudo chown 1000:1000 ./cap-dataservices: cap: image: tiago2/cap:latest volumes: - ./cap-data:/usr/src/app/data # ...若无法在宿主机改属主如 Coolify 等平台最简单的做法是不 bind mount镜像预置了权限正确的数据目录、改用 named volume、或换成不需要本地文件的 IP 数据提供商。该功能实现位于 standalone/src/ipdb.js国家/ASN 数据也用于仪表盘的地理统计与按 ASN/国家的封锁规则。部署小结与生产建议把整条链路串起来一次完整的交互是前端cap-widget>赞分享网络安全应用安全后端【免费下载链接】capFree, open-source and self-hosted CAPTCHA alternative to reCAPTCHA. Privacy-first and powered by proof-of-work and instrumentation challenges.项目地址https://gitcode.com/gh_mirrors/cap13/cap点击查看免费下载相关推荐Cap Standalone 自托管 CAPTCHA 后端实战指南Docker 部署、Dashboard 密钥管理与 siteverify 验证Cap Standalone 自托管 CAPTCHA 后端实战指南Docker 部署、Dashboard 密钥管理与 siteverify 验证 Cap St网络安全应用安全后端Cap Standalone 自托管部署指南用 Docker 一键搭建 reCAPTCHA 替代后端Cap Standalone 自托管部署指南用 Docker 一键搭建 reCAPTCHA 替代后端 Cap Standalone 是 Cap 项目官方推荐的网络安全应用安全后端在Steam Deck上搭建你的怀旧游戏博物馆EmuDeck配置指南在Steam Deck上搭建你的怀旧游戏博物馆EmuDeck配置指南 还记得小时候那些让我们废寝忘食的经典游戏吗那些在红白机、PS2、Game Boy上度过网络安全应用安全后端上一篇清理 macOS 系统的开源脚本——cleanmac 安装与配置指南下一篇cann/asc-devkit乘法API文档创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考