抓包看到登录 cookie 里有一段和用户编号对得上的数字,改大一位再请求,页面显示成了另一个用户,权限也跟着换人。乍看像缓存或者权限的锅,追下去往往不是。
wp_set_auth_cookie($user_id, true);
$u = wp_validate_auth_cookie($_COOKIE[LOGGED_IN_COOKIE]);
if (!$u) wp_die('登录已失效');
追下去是这么回事:自建登录逻辑把用户编号直接写进 cookie 并原样信任,没有签名校验,改动之后就被当成合法身份,改一个数字就换了身份,风险很直接。
碰到「WordPress 登录 Cookie 伪造」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。
先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。
具体做法是,改用官方函数来生成一条完整的带签名登录 cookie 凭证;校验的时候走官方的验证函数,不要直接去读 cookie 值;把以前那一套自定义的 cookie 方案全部作废并且清空。
验收就看一点,手工把 cookie 里的数字改掉后请求被拒,正常登录不受影响,日志里有记录。
