form.addEventListener('focusin', () => {
  if (!startAt) startAt = Date.now();
}, {once: true});

用 Chrome 自动填充的用户提交表单时提示「提交过快」,正常手填要四十秒,自动填充不到两秒就完成,一天误伤二十多人。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:反垃圾规则只看了从渲染到提交的时长,低于三秒就判机器人,没考虑浏览器自动填充和记住密码。计时起点还放在了脚本加载时。

「提交耗时判定」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。同一份配置存在多处的,先确认改的是被加载的那一份。

新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

处理上按这个顺序:计时从用户第一次聚焦输入框开始,别从页面渲染算;耗时过短只作为评分项,不单独拒绝,结合蜜罐和频率一起判断;保留被拒请求的样本,每周回看误判比例。

确认没问题再收工,自动填充提交不再被拦,脚本批量提交仍然会被判为异常。

作者 9823189