必须在config/app.php中配置'secure'=>true、'httponly'=>true、'samesite'=>'Lax',反向代理时还需设'https'=>true并清除缓存;或在public/index.php中强制声明HTTPS环境。

如果您在ThinkPHP应用中需要确保Cookie不被客户端脚本读取、仅通过HTTPS传输并防止跨站请求伪造攻击,则必须对Cookie的安全属性进行显式配置。以下是实现此目标的多种配置方法:
一、修改全局Cookie配置文件
ThinkPHP 6 的 Cookie 安全配置统一入口位于 config/app.php 文件中的 'cookie' => [] 数组内,所有安全参数必须在此处声明,单独修改 config/cookie.php 或 config/cache.php 不生效。
1、打开项目根目录下的 config/app.php 文件。
2、定位到 'cookie' => [] 配置块,确认其存在且未被注释。
立即学习“PHP免费学习笔记(深入)”;
3、在该数组中添加或修正以下键值对:'secure' => true, 'httponly' => true, 'samesite' => 'Lax'。
4、若部署在反向代理后(如 Nginx 终止 HTTPS),必须同时设置 'https' => true,否则 secure 标志将因协议检测失败而被框架自动禁用。
5、保存文件后清除运行时缓存:执行 php think clear:runtime 命令或手动删除 runtime/cache/ 目录内容。
二、在 public/index.php 中强制声明 HTTPS 环境
当 Web 服务器(如 Nginx)以反向代理方式终止 HTTPS 并转发 HTTP 请求至 PHP 时,ThinkPHP 默认无法识别原始协议。此方法在框架初始化前直接篡改 $_SERVER 变量,确保后续所有安全判断基于真实协议状态。
1、打开 public/index.php 文件。
2、在 标签后的第一行插入以下代码段:
3、检查请求头中是否存在 X-Forwarded-Proto 且其值为 https。
4、若条件成立,则强制设置 $_SERVER['HTTPS'] = 'on'。
5、确保该代码位于 require __DIR__.'/../vendor/autoload.php'; 之前,以保证其在框架加载前生效。
三、在控制器中调用 Cookie::set() 时显式传入安全选项
全局配置可能被单次调用覆盖,尤其在使用 Cookie::set() 方法动态写入 Cookie 时,secure 和 httponly 不会自动继承全局设置,必须在 $option 参数中显式声明,否则生成的 Cookie 将缺失关键安全标志。
1、在控制器方法中调用 Cookie::set() 时,第三个参数必须为关联数组。
2、数组中至少包含 'secure' => true 和 'httponly' => true 两项。
3、若需跨子域共享,添加 'domain' => '.yourdomain.com'(注意开头的点号)。
4、若设 'samesite' => 'None',则 secure 必须为 true,否则浏览器拒绝接受该 Cookie。
5、示例调用:Cookie::set('auth_token', $token, ['expire' => 86400, 'path' => '/', 'domain' => '.example.com', 'secure' => true, 'httponly' => true, 'samesite' => 'Lax']);
四、配置反向代理信任与协议透传
仅设置 PHP 层逻辑不足以让 ThinkPHP 正确识别 HTTPS;Web 服务器必须将原始协议头透传至 PHP,并且框架需启用代理信任机制,否则 Request::isSsl() 始终返回 false,导致所有依赖 SSL 判断的功能失效。
1、在 Nginx 配置中,于 proxy_pass 指令所在 location 块内添加:proxy_set_header X-Forwarded-Proto $scheme;
2、在 Apache 配置中,启用 mod_headers 后添加:RequestHeader set X-Forwarded-Proto "https" env=HTTPS
3、打开 config/app.php,将 'trust_proxy' 项设为 true 或指定可信代理 IP 段,例如:'trust_proxy' => ['127.0.0.1', '10.0.0.0/8']。
4、验证是否生效:在控制器中打印 var_dump(request()->isSsl());,预期输出为 bool(true)。
五、同步配置 Session 的安全属性
Cookie 安全配置不能仅限于普通 Cookie;若应用使用了 Session 功能,其底层仍依赖 Cookie 存储 session_id,因此 session.php 中的对应安全参数也必须一致开启,否则登录态可能在 HTTPS 页面下丢失或被 XSS 攻击窃取。
1、打开 config/session.php 文件。
2、确认 'type' 项非 file(推荐使用 cache 或 redis 等服务端存储)。
3、在 'cookie' 子数组中,设置 'secure' => true 和 'httponly' => true。
4、同样添加 'samesite' => 'Lax',并与 Cookie 配置中的值保持一致。
5、若已启用 cookie 加密(auto_encrypt = true),确保 secret_key 在 config/app.php 中已正确配置且未为空。



















