You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何防止Newsletter新闻通讯退订接口被恶意滥用

新闻通讯退订功能防滥用的成熟工程方案

你当前实现的核心问题是将公开可枚举的邮箱地址作为退订接口的唯一鉴权凭证,等于完全没有做权限校验,任何知道他人邮箱的人都可以构造请求恶意退订,甚至爬虫批量遍历邮箱就能把你的全部订阅用户删光。以下是业界通用的落地方案,组合使用可以覆盖绝大多数滥用场景:

1. 为每个订阅用户生成全局唯一、不可预测的退订令牌(核心必做)

这是所有主流邮件订阅服务的标准实现:

  • 用户完成订阅时,除了存储邮箱地址,额外为每个订阅记录生成一个密码学安全的随机唯一令牌,推荐直接用crypto.randomUUID()生成,或者生成32位以上的随机十六进制字符串,令牌和订阅记录一一绑定,同时设置过期时间(比如生成后180天有效,过期后用户需要重新触发退订邮件获取新链接)。
  • 退订链接不要明文暴露邮箱,格式调整为/unsubscribe?token=<对应令牌>,接口逻辑不再从路径里取邮箱,而是先根据传入的令牌查询匹配的有效订阅记录,查不到直接返回无效链接提示,匹配成功才进入后续退订流程。
  • 所有发给用户的邮件(订阅确认邮件、每一期新闻通讯的页脚退订入口)都使用对应用户专属的带令牌链接,由于令牌是随机无规律的,攻击者就算知道受害者的邮箱,也几乎不可能猜中对应的令牌,无法构造出有效的退订请求。
// 订阅时生成token的示例逻辑
const { randomUUID } = require('crypto');
// 新建订阅者时写入token
const newSubscriber = await Subscriber.create({
  email: userInputEmail,
  unsubscribeToken: randomUUID(),
  tokenExpireAt: Date.now() + 180 * 24 * 60 * 60 * 1000 // 180天有效期
})
// 调整后的退订页路由逻辑(先做token校验,不要直接删数据)
app.get('/unsubscribe', async (req, res) => {
  const { token } = req.query;
  if (!token) return res.status(400).send('无效的退订链接');
  // 查匹配的、未过期的订阅记录
  const subscriber = await Subscriber.findOne({ 
    unsubscribeToken: token,
    tokenExpireAt: { $gt: Date.now() }
  });
  if (!subscriber) return res.status(400).send('退订链接无效或已过期');
  // 匹配成功后跳转到确认页,不要直接执行删除
  res.render('unsubscribe-confirm', { email: subscriber.email, token: token });
})

2. 增加退订二次确认,避免误触发和自动化扫描

不要让用户点了退订链接就直接执行删除操作:

  • 点链接进入退订确认页,页面明确提示待退订的邮箱地址,设置“确认退订”按钮,用户主动点击后,再通过POST请求提交token执行实际的删除操作。
  • 这个设计可以挡住绝大多数场景的误操作:比如邮件客户端的链接预加载、安全爬虫的路径扫描、用户点错链接,都不会直接触发退订。如果担心自动化脚本点确认,可以加一个极轻量的人机校验(比如点击“我不是机器人”的复选框),不需要复杂的验证码就能挡住绝大多数批量攻击。

3. 加基础的限流和异常监控,兜底防批量攻击

  • 给退订接口加访问频率限制:比如单个IP1小时内最多触发5次退订操作,超过阈值直接临时拦截,避免攻击者批量枚举令牌、批量提交邮箱尝试撞库。
  • 配置简单的异常告警:如果短时间内退订请求量、退订成功量远超日常平均水平,自动触发告警,方便及时介入排查攻击。

额外需要修正的实现问题

  • 你当前的路由写法/unsubscribe:subEmail存在匹配缺陷,邮箱中的@``.等特殊字符很容易导致路由匹配失败,不建议用路径参数传递这类复杂字符串,用query参数传递token更稳妥。
  • 所有用户传入的参数都要做合法性校验,不要直接把参数传入数据库查询,避免注入风险。
  • 退订操作要留操作日志,记录退订时间、请求IP、对应的token,出现异常退订时可以溯源。

内容的提问来源于stack exchange,提问作者PeePeeMoniker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 14:03:18