我们修复注册流水线的日子
我们的注册量每周都在增长。团队感到很兴奋。但数据感觉不对劲。用户从不回来。电子邮件地址看起来很奇怪。我们的激活率下降了。
我查看了数据。我没有发现增长,只发现了噪音。
问题所在
我运行了一个查询,按 IP 地址对注册进行分组。一个 IP 地址在 24 小时内注册了数百个账号。它使用了相同的浏览器指纹。一个脚本正在请求我们的 register 接口。它使用了临时邮箱域名。这是一个机器人,而不是真人。
我们的注册流水线处于完全敞开的状态。
解决方案
我们在一个冲刺(sprint)中构建了三层保护。
第一层:限流 (Throttling)
我们使用了两种类型的速率限制。
- 按 IP 限流:我们限制在短时间内来自同一个 IP 的注册尝试。
- 按域名限流:我们限制在较长时间窗口内来自同一个邮箱域名的注册。这可以阻止使用相同域名但不同 IP 的机器人。
第二层:黑名单 (Blocklists)
- 屏蔽邮箱域名:我们拒绝任何使用临时邮箱域名的注册。
- 屏蔽 User Agent:我们拒绝来自非浏览器工具的请求。我们不对攻击者提供任何细节。
第三层:IP 黑名单
有些 IP 是顽固的。它们滥用我们系统的多个部分。我们使用硬黑名单。这些 IP 的每一个请求都会被拒绝。中间件会立即拦截它们。
结果
修复前:
- 一个 IP 一天创建数百个账号。
- 临时域名占据了大部分注册。
- 虚假账号降低了我们的激活率。
- 我们的数据是错误的。
修复后:
- 批量注册行为 (Registration farming) 降至零。
- 临时域名注册停止了。
- 注册量显示了真实的真人意图。
- 我们的激活率恢复了。
教训
- 信号比数量更重要。机器人会让留存率和收入等指标变得不可靠。
- 小规模的代码修复可以解决大问题。我们使用了三种简单的机制。
- 分层是必要的。单一的限制是不够的。组合拳可以覆盖更广的范围。
- 控制你的响应。给合法用户反馈,给恶意行为者沉默。
增长不仅仅是获取用户,更是获取真实用户。你的产品决策取决于优质的数据。而这些数据始于你的注册接口。
来源:https://dev.to/ogeobubu/the-day-we-fixed-our-signup-pipeline-3664