用户点邮件里的重置链接,页面直接提示该链接已失效,日志里这条 token 五分钟前就被消费过一次,来源 IP 是邮件网关的地址段。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,企业邮箱的链接安全扫描会先把正文里的 URL 抓一遍,一次性 token 访问即作废,用户真正点开时就成了第二次访问。令牌在校验时只要被读到就置空,扫描器一碰就没了。

「重置链接被预取」这类改动最怕改一半,回滚脚本先准备好,再动生产。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。

// 确认页只校验不消费
$row = $wpdb->get_row($wpdb->prepare(
  "SELECT * FROM {$wpdb->prefix}reset_tokens WHERE token=%s AND used=0", $t));
// 真正重置时再 UPDATE used=1

具体做法是,别在 GET 请求里消费 token,先渲染确认页,用户点继续再走 POST 作废;令牌表加一列记录消费来源,日志里能区分扫描器和真人;同一个 token 在短时间内幂等返回确认页,别一读就删;上线后拿开了链接扫描的企业邮箱实测一遍。

最后用这个标准收尾,邮件点开先看到确认页,再点一次才进改密表单,日志里不再出现网关 IP 消费 token。

作者 9823189