去年活动发的问卷链接今天仍能提交,后台多出 40 条无效样本,活动早就结束了。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
$sig = hash_hmac('sha256', $id . '|' . $exp, SECRET);
if (time() > $exp || !hash_equals($sig, $_GET['sig'])) { abort(410); }
链接里只带了 survey_id,没有签名也没有过期时间。关闭问卷只是把入口隐藏,接口没校验状态。这一点先确认清楚,后面就不用反复试。
「问卷链接过期」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。
改完隔一天再看一次,当场正常不代表能稳住。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。
线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。
具体做法是,链接加 exp 和 sig 两个参数,用 hash_hmac 签名;接口先校验签名和过期时间,再看问卷是否开放;把已结束问卷的链接批量置为失效并测一条。
改完照着核一遍,过期链接返回 410,新链接正常提交,后台不再出现活动结束后的样本。
