拿到用户的session id就等于拿到登录态,劫持者不需要密码。session id主要从cookie里来,而cookie默认配置相当裸奔:脚本可读、明文传输、无严格归属校验。四个ini配置补齐这些洞。
; php.ini
session.cookie_httponly = 1 ; JS读不到cookie,防XSS窃取
session.cookie_secure = 1 ; 仅HTTPS传输
session.cookie_samesite = Lax ; 跨站请求不带cookie,防CSRF
session.use_strict_mode = 1 ; 拒绝自造的session id
httponly挡的是XSS偷cookie:就算页面被注入脚本,document.cookie也读不到session。samesite=Lax后,别的网站发起的POST不再携带你的cookie,CSRF攻击面直接砍掉大半。use_strict_mode常被忽略——没有它,攻击者可以先访问你的站、伪造一个session id放进URL诱导受害者点开,受害者带着这个id登录,攻击者就能共用会话。
除了配置,代码层还要做两件事:权限变化时重新生成id,比如登录成功后调session_regenerate_id(true),旧id立即作废;长期不动的会话设合理超时,别让半年前的登录态还活着。
// 登录成功后立刻换id
session_regenerate_id(true);
$_SESSION['user_id'] = $uid;
// 敏感操作前校验指纹:IP或UA突变即销毁
if ($_SESSION['ua'] !== md5($_SERVER['HTTP_USER_AGENT'])) {
session_destroy();
exit('会话异常,请重新登录');
}
顺手检查session文件的存放路径,别落在web可访问目录里,历史上的会话文件泄露事件多数栽在这。改完php -i看一眼生效值,别信配置文件,信运行时。
申请创业报道,分享创业好点子。点击此处,共同探讨创业新机遇!



