如何避免NodeJS函数被垃圾请求频繁调用?(Express SMTP联系表单场景)
Express 联系表单SMTP发送函数的服务端防滥用方案
所有校验逻辑需前置部署,从请求入口到SMTP发送链路做多层拦截,避免无意义请求消耗应用、SMTP服务器资源,杜绝短时间内高频提交触发邮件服务商封禁的问题。
分层落地方案
入口端高频请求拦截
- 基于单IP的接口限流:在表单提交路由的最前置位置挂载限流逻辑,可使用
express-rate-limit中间件实现,配置合理阈值:单个IP每10分钟最多允许3次有效提交请求,超过阈值直接返回429 Too Many Requests,不进入后续参数校验、SMTP发送流程。如果是多实例部署的服务,将限流计数的存储位置从内存替换为Redis,避免实例分别计数导致限流失效。 - 全局请求计数兜底:在不限制单IP请求频率的前提下,设置整个表单接口的全局小时级阈值,比如每小时最多处理10封联系表单邮件,超过阈值的请求直接记录日志、进入人工审核队列,不直接触发SMTP发送,从根源上避免发件量突增被邮件服务商标记。
自动化提交识别拦截
- 蜜罐字段校验:在前端表单中添加1个对普通用户完全隐藏的输入字段(比如字段名
website),通过CSS将字段设置为视觉不可见、屏幕阅读器忽略,不向普通用户做任何提示。正常用户不会注意到也不会填写该字段,自动化脚本抓取表单时通常会填完所有输入项,服务端只要检测到该字段非空,直接静默丢弃请求,不返回任何明确的拦截提示,让自动化脚本无法识别拦截规则。 - 提交时限校验:在用户加载联系表单页面时,生成一个带时间戳的随机校验token存入服务端缓存,用户提交表单时校验token有效性,同时校验请求提交时间和表单加载时间的间隔:间隔小于3秒的请求直接拦截。正常用户填写多字段的联系表单不可能在3秒内完成提交,该规则可以挡住绝大多数无差别自动化提交脚本。
- 内容合法性校验:对表单提交的内容做规则过滤:消息文本中垃圾链接占比超过30%、文本为无意义重复字符、输入的邮箱格式不符合通用规范的请求,直接拦截不进入发送流程,减少无意义的SMTP连接消耗。
发送链路兜底
- 同内容去重逻辑:对最近10分钟内的提交内容做相似度比对,连续出现相似度超过90%的提交时,直接拦截后续同内容请求,哪怕请求来自不同IP也不放行,挡住换IP刷量的脚本。
- 不对公开暴露固定的SMTP发送接口路径,可将提交路径设置为和前端域名绑定的随机哈希值,避免脚本通过通用路径扫描定位到发送接口。
注意:对被拦截的请求尽量不要返回明确的“触发拦截规则”的提示,模拟正常的提交成功响应即可,避免攻击者快速调整脚本绕过规则。
内容的提问来源于stack exchange,提问作者South3492
相关产品推荐
相关产品推荐

