必须启用session.cookie_secure=1且仅在HTTPS下生效,否则Cookie不发送导致登录失败;同时需配置HttpOnly、SameSite=Lax和use_strict_mode=1,分别防御XSS、CSRF和会话固定攻击。

必须启用 session.cookie_secure=1 且只在 HTTPS 下生效
中间人攻击(MITM)能直接截获明文传输的 Cookie,session.cookie_secure=1 是强制浏览器仅通过 HTTPS 发送会话 Cookie 的硬性开关。它不是“建议开启”,而是“不开启即失效”——只要 PHP 运行在 HTTP 环境下,该配置会直接导致 Cookie 不被浏览器发送,用户无法登录。
常见错误现象:
- 页面反复跳转回登录页,但无报错
- 开发者工具 Network 标签中看不到
Set-Cookie: phpMyAdmin=...响应头 - curl 测试返回 302 但未携带新 Cookie
实操建议:
- 在
php.ini中设session.cookie_secure = 1,不要依赖ini_set()—— PHP 8.0+ 对运行时修改部分 session 参数已限制 - 确认 Web 服务器(Nginx/Apache)已正确终止 HTTPS,并透传
X-Forwarded-Proto: https(若前端有反向代理) - 检查
$_SERVER['HTTPS']是否为"on"或"1",否则session_start()可能静默降级
务必设置 session.cookie_httponly=1 防止 XSS 窃取
session.cookie_httponly=1 让 JavaScript 无法读取 phpMyAdmin Cookie,这是阻断 XSS 后继窃取的关键一环。即使攻击者成功注入脚本,也拿不到会话 ID。
立即学习“PHP免费学习笔记(深入)”;
容易踩的坑:
- 只在
config.inc.php里用ini_set('session.cookie_httponly', 1)—— PHP 8.0 要求该参数必须在session_start()前、且首次初始化 session 时生效,运行时调用无效 - 误以为 “用了 HTTPS 就不用 HttpOnly” —— MITM 和 XSS 是两类独立攻击,防护不能互相替代
- 搭配
auth_type = 'cookie'时,$cfg['blowfish_secret']若太短或可预测,攻击者可能解密 Cookie 内容并伪造,此时 HttpOnly 也救不了
验证方式:打开浏览器开发者工具 → Application → Cookies,查看 phpMyAdmin 条目是否标有 “HttpOnly” 标记。
必须配 session.cookie_samesite=Lax(非 None)防 CSRF 携带
session.cookie_samesite=Lax 能阻止跨站请求(如恶意网站里的 <form action="https://pma.example.com/sql.php">)自动带上会话 Cookie,从协议层削弱 CSRF 攻击链。它不是“锦上添花”,而是现代浏览器默认行为的对齐要求。
为什么不能设 None?
- Chrome/Firefox/Safari 已强制要求:
SameSite=None必须搭配Secure,否则直接忽略该 Cookie - 设成
None会扩大攻击面,让跨站请求也能携带会话凭证,违背最小权限原则 -
Lax在绝大多数 phpMyAdmin 操作(点击链接、GET 表单提交)中保持会话有效,仅拦截危险的 POST 跨站请求,兼容性与安全性平衡最好
注意:PHP 7.3+ 才原生支持 session.cookie_samesite,PHP 8.0 下必须显式配置,不可省略。
别漏掉 session.use_strict_mode=1 这个底层保险
session.use_strict_mode=1 是堵住会话固定(Session Fixation)的最后一道网——它让 PHP 拒绝所有未经自身生成的会话 ID。哪怕攻击者通过 URL 参数或 Cookie 强塞一个看似合法的 PHPSESSID,服务端也会直接创建新会话,旧 ID 彻底无效。
这个配置常被忽略,因为它不直接影响 MITM 的“窃取”环节,但决定了“窃取后能否复用”:
- 没开 strict_mode:攻击者提前分发
?PHPSESSID=abc123,用户点击登录,服务端照单全收,会话即被接管 - 开了 strict_mode:同上操作,服务端无视
abc123,生成全新 ID,攻击者手里的旧 ID 彻底作废
实操要点:
- 必须写进
php.ini,不能靠运行时ini_set() - 需配合登录成功后立即执行
session_regenerate_id(true),否则首次会话仍可能被固定 - 若使用负载均衡或共享 session 存储(如 Redis),确保所有节点 php.ini 一致,否则某台机器开着 strict_mode、另一台没开,防护就断了



















