ThinkPHP 6 中 cookie.httponly 默认为 false,需显式设为 true 才禁用 JS 访问;cookie.encrypt 默认 true 仅加密值,不隐匿 key;须全局配置与 Cookie::set() 参数均指定 httponly=>true、encrypt=>true,并确保 app_encrypt_key 一致且为布尔值。

ThinkPHP 6 的 cookie 配置不生效?先确认你用的是哪个版本
ThinkPHP 5.1 和 6.x 对 Cookie 加密、httponly 的控制逻辑完全不同,TP5.1 默认不加密,TP6 开始默认启用 cookie.encrypt,但这个“加密”只是对值做 AES 加密,不等于自动设 httponly=true。很多人配了 encrypt=true 就以为安全了,结果 document.cookie 还能读到明文 key——因为 httponly 是独立开关。
-
cookie.httponly控制浏览器脚本能否访问 Cookie,和加密无关 -
cookie.encrypt控制写入前是否 AES 加密值(读取时自动解密),但 key 本身仍以明文暴露在响应头中 - TP6 中
cookie.encrypt默认为true,但cookie.httponly默认是false
如何正确开启 Cookie 加密并强制 httponly
不是改 config 文件就完事。TP6 的 cookie 配置分两层:全局配置决定默认行为,Cookie::set() 调用时的参数可覆盖它。最稳妥的方式是在每次写入时显式指定:
- 全局配置(
config/cookie.php)建议设:'httponly' => true、'encrypt' => true、'secure' => $_SERVER['HTTPS'] ?? false - 代码中调用:
Cookie::set('user_token', $token, ['httponly' => true, 'encrypt' => true]) - 注意:如果全局开了
encrypt,但调用时传'encrypt' => false,值不会加密;反之,全局关了,调用时传true,仍会加密
Cookie::get() 读不到加密后的值?检查密钥和算法一致性
TP6 默认用 cookie.encrypt_key(来自 config/app.php 的 app_encrypt_key)做 AES-128-CBC 加密。如果手动改过 app_encrypt_key,或部署时没同步密钥,旧 Cookie 就无法解密,Cookie::get() 返回 null,且无任何报错提示。
- 加密密钥必须与部署环境完全一致,不能用默认的
thinkphp - 不要在运行时动态修改
Config::set('cookie.encrypt_key', ...),会导致加解密错乱 - 调试时可用
Cookie::has('xxx')判断是否存在,再用Cookie::getRaw('xxx')查原始加密字符串,确认是不是解密环节出问题
为什么设置了 httponly=true,F12 还能看到 Cookie?
这是常见误解。httponly 只禁止 JavaScript 通过 document.cookie 读取,不影响浏览器开发者工具的 Application → Cookies 标签页显示。只要响应头里有 Set-Cookie: xxx; HttpOnly,就说明生效了。真正要验证,得在控制台执行:document.cookie —— 如果返回空字符串或不含该 Cookie 名,才算成功。
立即学习“PHP免费学习笔记(深入)”;
- Chrome/Firefox 的 DevTools 显示的是服务端下发的所有 Cookie,和
httponly无关 - 用
curl -I http://your.site看响应头,确认含HttpOnly字样 - TP6 中若配置项写成
'httponly' => 'true'(字符串),会被当false处理,必须是布尔值true
encrypt 和 httponly 同时生效,再考虑别的。



















