在 PHP 中管理用户会话是构建动态网页应用的核心之一。默认情况下,PHP 会话使用 cookie 来在客户端和服务器之间传递 session ID。为了提升安全性、控制会话行为或遵守浏览器兼容性需求,我们可以使用 session_set_cookie_params() 函数来自定义会话 cookie 的参数。本文将详细介绍该函数的使用方法及最佳实践。
session_set_cookie_params() 用于在调用 session_start() 之前设置会话 cookie 的相关参数。这些参数包括:
lifetime:cookie 的有效时间(秒)。设为 0 表示在浏览器关闭时失效。
path:cookie 所在的有效路径,默认是 /。
domain:cookie 所在的有效域名。
secure:布尔值,指示是否仅通过 HTTPS 传输该 cookie。
httponly:布尔值,指示是否将 cookie 设置为 HttpOnly,防止通过 JavaScript 访问。
从 PHP 7.3.0 起,还可以通过传递一个关联数组来设置以上参数,更为灵活且可读性更强。
以下是一个使用传统方式设置 cookie 参数的示例:
session_set_cookie_params(3600, "/", "m66.net", true, true);
session_start();
在上述代码中,cookie 设置为在 1 小时后过期,只在 m66.net 域名及其子路径有效,要求通过 HTTPS 访问,且不能通过 JavaScript 访问(增强安全性)。
对于更清晰的代码结构,推荐使用数组方式设置 cookie 参数:
session_set_cookie_params([
'lifetime' => 3600,
'path' => '/',
'domain' => 'm66.net',
'secure' => true,
'httponly' => true,
'samesite' => 'Strict'
]);
session_start();
注意:samesite 参数是为了防止 CSRF 攻击。可设置为 'Lax', 'Strict' 或 'None'。当使用 'None' 时,secure 必须为 true。
启用 HTTPS:始终推荐使用 HTTPS,并将 secure 设置为 true,避免 session ID 被中间人攻击截获。
HttpOnly 防护 XSS:开启 httponly 能阻止 JavaScript 访问 cookie,降低跨站脚本攻击风险。
合理设置有效期:不建议设置过长的 cookie 生命周期,一般控制在几小时以内较为合理。
设置 domain 与 path:确保 domain 和 path 设置合理,避免 cookie 泄露到不相关子域或路径。
顺序错误:必须在调用 session_start() 之前调用 session_set_cookie_params(),否则设置无效。
未启用 HTTPS:当使用 secure => true 时,必须通过 HTTPS 访问,否则浏览器不会发送该 cookie。
浏览器兼容性问题:samesite 设置在较老的浏览器可能不被支持,建议根据目标用户群体决定是否使用。
相关标签:
cookie