news 2026/9/28 18:26:31

treg 被屏蔽邮箱域名(TREG_BLOCKED_EMAIL_DOMAINS)机制详解:防批量注册的完整指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
treg 被屏蔽邮箱域名(TREG_BLOCKED_EMAIL_DOMAINS)机制详解:防批量注册的完整指南

treg 被屏蔽邮箱域名(TREG_BLOCKED_EMAIL_DOMAINS)机制详解:防批量注册的完整指南

【免费下载链接】tregOpenRouter for agent tools. Join community here: https://discord.gg/6mQYYfFMAn项目地址: https://gitcode.com/GitHub_Trending/treg/treg

treg 是一款面向 Agent 工具的数据 API 网关,而它的被屏蔽邮箱域名机制(环境变量TREG_BLOCKED_EMAIL_DOMAINS)是一道轻量但精巧的反作弊防线:通过一条逗号分隔的环境变量,就能在登录、注册、建队的所有入口拒绝一次性邮箱域名,且无需重新部署。本文用大白话讲清它的配置方式、匹配规则和背后的安全设计。

为什么 treg 需要邮箱域名屏蔽?

先说动机,理解了它才理解设计:

  • 🎁 在 treg 中,每创建一个新的团队(Org)都会发放一笔促销余额,这对拉新很友好;
  • ⚠️ 但对羊毛党来说,用一次性邮箱(throwaway email)批量注册、批量建队,就能白拿大量余额;
  • 🛡️ 因此 treg 提供了一份邮箱域名黑名单,把已知的垃圾邮箱域整体拦在门外。

关键取舍是:黑名单完全由配置驱动,代码里不内置任何清单。因为攻击者几分钟就能换一批新域名,如果黑名单要靠发版更新,永远慢一步;而改一条环境变量(或控制台字段)几秒就生效——官方称之为 "speed bump"(路障)。

如何配置 TREG_BLOCKED_EMAIL_DOMAINS?

配置非常简单,核心只有一条环境变量:

# 逗号分隔,大小写不敏感;留空 = 不屏蔽任何域名 TREG_BLOCKED_EMAIL_DOMAINS=throwaway-mail.com,spam-box.net

配置与解析逻辑见 src/treg/config.py,环境变量说明表在 README.md 中也有收录。

解析时会做一层"运维容错"(见 _blocked_email_domains):

输入处理
Farm-B.example自动转小写
@farm-c.example、.farm-d.example去掉开头误粘的@或.
(空格、空项)直接丢弃
com(无点的裸后缀)强制丢弃——防止一次手误就屏蔽全世界

解析结果经lru_cache缓存,同一个值只解析一次,而不是每个请求都重新切分字符串。

匹配规则:只认域名,子域名连坐,TLD 绝不连坐

分类器 _is_blocked_email 有两条铁律,规则设计非常克制:

  1. 只看@后面的域名部分,绝不匹配整个邮箱。因为如果匹配完整地址,用户名里恰好包含某段字符串的正常用户(如farm-a@company.dev)会被误伤;
  2. 逐级向上级域名回溯匹配:列出mail.farm.com,则a@mail.farm.com、a@farm.com都被拦截(防"注册一个子域名就绕过"的一行代码);但永远不会单独拿最后一段 TLD 比对,所以a@id这类地址不可能被误拦。

用测试用例直观感受一下(节选自 tests/test_blocked_email_domains.py):

邮箱地址结果原因
a@farm-a.example🚫 拦截命中清单域名本身
A@FARM-B.EXAMPLE🚫 拦截大小写不敏感
a@deep.mail.farm-c.example🚫 拦截命中父域名(子域名连坐)
farm-a@company.dev✅ 放行只匹配域名,不匹配用户名
a@notfarm-a.example✅ 放行字符串后缀 ≠ 子域名
a@farm-a.example.org✅ 放行清单域名在中间,不是后缀

值得一提的是,项目还尝试过"子串匹配"(域名里含某字符串就拦),实测对公开的垃圾域名语料仅多覆盖 0.17%,却会拦掉域名里恰好含该字符串的正常公司——最终被移除。

哪些入口会被检查?treg 身份门全解析

被屏蔽域名在treg 所有身份入口都会触发检查,包括:

  • ✉️ 邮箱验证码登录:发起(/auth/email/start)与校验(/verify)
  • 🔁 GitHub / Google 社交登录回调
  • 📬 邮箱邀请链接
  • 📝 开放注册POST /users与建队POST /orgs(这两个入口会发放促销余额,是重点防护对象)

决策函数 blocked_email 有两个值得学习的设计:

  • 失败放行(fail open):分类器一旦抛异常,只记一条 error 日志,大门保持敞开——宁可漏拦,也不能让配置错误把正常用户的登录全打断;
  • 日志是唯一检测手段:每次拦截都会打一条可统计的结构化日志event=signup_blocked_domain door=... domain=...,方便从日志里数出拦截量。

被屏蔽后用户看到什么?

答案:几乎什么都不看。所有入口返回的是同一条通用 403 消息:

this address cannot be used to sign in

不透露"你被哪个规则拦了"、不区分新旧账号、不给出申诉通道细节——对自动化脚本来说毫无利用价值。已有的存量账号会被运营侧离线停用,而不是靠接口报错去发现,做到"拦而不扰"。

配套测试与官方文档

该机制的规则几乎每条都被固定为自动化测试,方便你深入了解边界情况:

  • 测试:tests/test_blocked_email_domains.py —— 覆盖"未配置不拦任何人"、大小写/空格容错、子域名连坐、裸 TLD 防御、失败放行等全部规则;
  • 安全文档:SECURITY.md —— 说明黑名单在"促销额度防刷"体系中的定位;
  • 部署文档:docs/context/ops/deploy.md —— 环境变量一览与运维口径;
  • API 文档:docs/context/interface/api.md —— 各身份入口的检查点清单;
  • 多租户架构:docs/context/architecture/multi-tenancy.md。

总结

treg 的TREG_BLOCKED_EMAIL_DOMAINS机制给出了一个反作弊黑名单的"最小可靠实现"范本:纯配置、秒级生效、只匹配域名、子域名连坐而 TLD 永不连坐、统一模糊提示、失败放行、日志可审计。对于需要防批量注册的开源项目,这 200 行左右的实现(解析 + 分类 + 决策)非常值得一读。

【免费下载链接】tregOpenRouter for agent tools. Join community here: https://discord.gg/6mQYYfFMAn项目地址: https://gitcode.com/GitHub_Trending/treg/treg

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/28 18:25:17

STM32 上跑 MQTT 怎么选?嵌入式 MQTT 客户端 C 语言实现对比

STM32 上跑 MQTT 怎么选?嵌入式 MQTT 客户端 C 语言实现对比做嵌入式设备联网,STM32 上跑 MQTT 是绕不开的话题。LwIP 开源 MQTT 客户端自己写,还是直接用现成 SDK?本文对比主流选择,给出 STM32F4 实测结论。建议 CSD…

作者头像 李华
网站建设 2026/9/28 18:24:45

智谱 Z Code 配置 TaoToken:Claude Code、Codex、Gemini 统一 Key 接入指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/28 18:24:25

UVa 930 Polynomial Roots

题目描述 给定一个 nnn 次多项式 P(x)anxnan−1xn−1…a1xa0P(x) a_{n}x^{n} a_{n - 1}x^{n - 1} \ldots a_{1}x a_{0}P(x)an​xnan−1​xn−1…a1​xa0​ 的全部 n1n 1n1 个系数,以及该多项式的 n−2n - 2n−2 个实根,要求计算出剩下的两个实根。…

作者头像 李华