登录后 Set-Cookie 只有 PHPSESSID=...; path=/,没有 HttpOnly 也没有 Secure。页面里一段注入的脚本执行 document.cookie,会话 id 就被带到了外部地址。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,Cookie 默认对脚本可见,前端任何一段能执行的代码都能读到。注入点不一定在自己代码里,第三方统计脚本和富文本内容都算。少了这个属性,XSS 的后果从改页面变成直接接管账号。
碰到「Cookie HttpOnly」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。报错里带路径的,先去看那个路径在不在、权限对不对。
curl -sI https://example.com/login -d 'u=a&p=b' | grep -i set-cookie # 期望:PHPSESSID=...; Path=/; Secure; HttpOnly; SameSite=Lax
同一份配置存在多处的,先确认改的是被加载的那一份。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。
具体做法是,会话 Cookie 全部加上 HttpOnly 和 Secure;SameSite 设成 Lax 或 Strict 按业务选;顺带补上 Path 和合理的过期时间;用 curl 看响应头确认属性都写进去了。
最后用这个标准收尾,控制台执行 document.cookie 看不到会话 id 响应头里三个属性都在。
