ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Loop Library表单网关安全设计:Turnstile、幂等键与限流去重的完整拆解

Loop Library表单网关安全设计:Turnstile、幂等键与限流去重的完整拆解 Loop Library表单网关安全设计Turnstile、幂等键与限流去重的完整拆解【免费下载链接】loop-libraryA library of practical AI-agent loops and an installable skill for finding, adapting, and designing repeatable agent workflows.项目地址: https://gitcode.com/gh_mirrors/lo/loop-libraryLoop Library 是一个面向 AI Agent 的实用循环loop工作流公开库用户既可以直接投稿 loop也可以订阅每周精选。这两类表单提交都经过一个精心设计的表单网关Cloudflare Turnstile 人机校验、幂等键Idempotency Key防重复、按 IP 限流与 24 小时内容去重。本文完整拆解这套安全机制的实现思路帮你理解如何为公开表单搭建可靠的防护体系。一次提交的完整旅程 ️所有表单请求都由部署在 Cloudflare Worker 上的网关统一处理入口在 loop-library/worker/src/index.js。一次提交会依次穿过这些关卡顺序防线拦截目标1CORS 源白名单陌生域名的跨站提交216 KB 请求体上限超大负载攻击3Honeypot 蜜罐字段自动填表的爬虫4Turnstile 验证限流刷验证接口的滥用5Turnstile 服务端复核伪造的人机校验令牌6幂等键绑定检查重复/篡改的表单会话7每小时 每日 IP 限流高频灌水824 小时内容指纹去重同一内容的重复投递全部通过后网关才把数据写入 here.now 的 Site Data 存储writeSiteData并返回201。任何一步失败都会得到带错误码的明确响应而不是静默失败。Turnstile 人机校验几乎无感的防护 ✨网站为两个表单分别配置了 Turnstile 组件样式为interaction-only——大多数访问者根本看不到验证弹窗只有可疑流量才会被挑战。前端script.js 中渲染验证组件成功回调后才启用提交按钮令牌过期会自动重置。服务端网关并不信任前端而是拿令牌向 Cloudflare 复核并做三重匹配verifyTurnstileaction必须与该表单一致投稿用submit_loop订阅用weekly_signup防止拿 A 表单的令牌去提交 B 表单校验通过的hostname必须在TURNSTILE_HOSTNAMES精确白名单内携带客户端 IP 参与校验提高判断质量。此外验证接口本身也有限流wrangler.jsonc 中为TURNSTILE_RATE_LIMITER配置了30 次 / 60 秒 / IP的配额超过即返回429与Retry-After: 60避免验证通道被当放大器滥用。相关运维规则见 AGENTS.md「Protected forms」。幂等键重复提交只算一次 前端在打开页面时就用crypto.randomUUID()生成一个 UUID v4 作为idempotency_keymakeIdempotencyKey整个表单会话期间保持不变提交成功后才换新。网关拿到令牌后会计算两个 SHA-256 哈希index.jsrequestHash整条记录的指纹代表这一份具体数据fingerprint内容指纹用于跨会话去重。幂等键的绑定逻辑在 Durable ObjectFormGuard中idempotency 方法规则很精巧场景判定结果同键 同内容重放replay按成功处理返回202不再写入同键 不同内容冲突返回409提示表单会话无效请刷新新键正常绑定 24 小时后放行这解决了网络抖动、按钮连点、页面重试等场景下的重复写入问题用户侧看到成功数据侧只落一条。同时把idempotency_key也透传给存储层的Idempotency-Key请求头L766-L774让写入端具备第二道防重。限流每个 IP 的配额账本 网关为每张表单定义了独立的配额FORM_DEFINITIONS表单每小时上限每日上限触发时的提示Loop 投稿/suggestions3 次10 次This connection has reached the submission limit.周更订阅/weekly-signups5 次10 次This connection has reached the signup limit.配额统计由 FormGuard.rate 完成它记录每个 IP以哈希存储不存明文近 24 小时内的提交事件滑窗计算小时数与日计数被限流时返回精确的retryAfter秒数。前端会读取Retry-After响应头友好地提示大约 N 分钟后再试postProtectedForm。注意一个细节限流检查只在非重放请求时发生L239-L246——合法重试不占用配额恶意刷量才会。内容去重24 小时内相同内容只留一条 ✂️限流管次数去重管内容。每张表单定义了一个指纹函数fingerprint投稿表单loop_title小写化instructions小写化并压缩空白订阅表单邮箱地址小写化。指纹经 SHA-256 后通过 reserveFingerprint 预留预留窗口为 24 小时。命中已有指纹时同一个幂等键的重放 → 静默返回202其他请求 → 同样返回202对用户表现为成功但不会创建第二条记录。还有个容易被忽略的优雅设计如果指纹已预留但后续写存储失败网关会调用 releaseFingerprint 释放预留用户修改后可以重新提交不会占坑一天。几层容易被忽略的小防线 Honeypot 蜜罐两个表单都藏了aria-hidden的 Company 隐藏域index.html人类看不到也填不到一旦有值网关立刻假装成功202并丢弃L176-L178。最低填写时长前端强制投稿表单填写满 1.2 秒、订阅表单满 0.8 秒script.js快速拦截脚本化提交。严格字段校验标题 ≤120 字符、正文 ≤3000 字符、X 账号必须归一化为handle、来源链接必须 http(s)全部在 validateSuggestion 中完成超长请求体直接413。源白名单只接受signals.forwardfuture.com与*.here.now的 Origin其余一律403getCorsHeaders。关键文件速查 模块路径表单网关主入口限流、幂等、去重调度loop-library/worker/src/index.jsFormGuard 状态存储Durable Objectloop-library/worker/src/index.js#L823-L1109前端表单与 Turnstile 集成loop-library/site/script.js#L1113-L1240Worker 部署配置限流器、Durable Objectsloop-library/worker/wrangler.jsonc表单安全运维规则AGENTS.md#L65-L89网关行为测试loop-library/worker/test/index.test.js总结Loop Library 的表单网关用人机校验 → 幂等键 → 限流 → 内容去重四层递进式防护把公开表单最常见的三类问题——机器人灌水、重复提交、恶意刷量——全部挡在存储写入之前而且每一层失败都有清晰的错误码与用户提示。这套设计对任何需要接收公开表单提交的项目都极具参考价值。【免费下载链接】loop-libraryA library of practical AI-agent loops and an installable skill for finding, adapting, and designing repeatable agent workflows.项目地址: https://gitcode.com/gh_mirrors/lo/loop-library创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表