Files
qing 30e064996c docs: 整理文档——分析类归位 reports/、补 captcha2/smtp3 README、修复全部失效链接
- profile/evaluation/promo_pack 移入 docs/reports/(按文档管理约定),内部引用同步
- 补建 captcha2/README.md、smtp3/README.md(主 README 曾引用但缺失)
- 重写 README 测试章节(实际为 tests/blackbox/,纯标准库零依赖)
- 清除全部 docs/INDEX.md 残留引用;legacy README 中已删除 ini 的失效链接改文字
- 全仓库链接检查 0 broken
2026-08-10 12:45:26 +00:00
..

captcha2 — C++20 验证码服务

captcha 的 C++20 重实现,接口与 Python 版完全兼容(pymsg 路由 image/verify/health),修复审计发现的安全项。基于 libmsg + boost::json + FreeType。

架构

ca :8443 (GET /captcha/image 代理给浏览器)
   │  pymsg TCP
   ▼
captcha2 :8009 (RpcServer)
  • 服务框架: libmsg RpcServer(pymsg 协议,4B 大端长度前缀 + UTF-8 JSON)
  • 图片生成: FreeType 渲染旋转字符 + 干扰线 + 噪点,stb_image_write 输出 PNG
  • 安全: std::mt19937 + random_device 安全随机、答案 XOR 防时序比较、全局生成速率限制
  • 异步日志: libmsg AsyncQueue → db2 Logs 表

接口

pymsg 路由 说明
image 生成验证码,返回 token + base64 PNG
verify 校验,一次性消费;错误答案 {valid:false}、无效 Token 带 error
health 健康检查

请求/响应 JSON 格式与 Python captcha 完全一致,ca 零改动。

配置

纯 CLI + 环境变量 + 默认值,不依赖 confs。

配置项 CLI 参数 默认值
绑定地址 --addr / -a 127.0.0.1
监听端口 --port / -p 8009
工作线程 --workers / -w 4
验证码长度 --len 4(2~8)
有效期 --ttl 300s
字体路径 --font-path /usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf
最大存储 --max-store 10000
速率限制 --rate-limit 600 次/分钟
实例名 / 日志级别 --instance / --log-level captcha2 / info

优先级: CLI > 环境变量 > 默认值;生产参数由 core/services.yaml 的 captcha2 条目 args 传入。

构建与运行

./_set.sh    # 编译
./_run.sh    # 运行

依赖: libmsg, boost::json, libfreetype, stb_image_write(单头文件,仓库内)

状态

许可证

MIT License