本文目录导读:

- 通过 PHP 配置文件(php.ini)
- 使用 session_set_cookie_params() 函数
- 修改现有 Cookie
- 使用 setcookie() 函数(PHP 7.3+ 推荐)
- 在 .htaccess 中设置(Apache)
- 检查是否已经设置
- 示例:完整的会话设置
- 重要注意事项
在 PHP 中设置 HttpOnly 属性有几种方法,以下是主要的方式:
通过 PHP 配置文件(php.ini)
在 php.ini 中设置:
session.cookie_httponly = 1
使用 session_set_cookie_params() 函数
在启动会话前设置:
// 在 session_start() 之前调用
session_set_cookie_params([
'lifetime' => 3600, // 过期时间(秒)
'path' => '/',
'domain' => $_SERVER['HTTP_HOST'],
'secure' => false, // HTTPS 下设为 true
'httponly' => true, // 设置 HttpOnly
'samesite' => 'Lax' // 可选:SameSite 属性
]);
session_start();
修改现有 Cookie
如果需要修改已存在的 cookie:
// 删除旧的 cookie
setcookie('session_id', '', time() - 3600, '/');
// 重新设置带 HttpOnly 的新 cookie
setcookie('session_id', session_id(), time() + 3600, '/', '', false, true);
// 参数:name, value, expire, path, domain, secure, httponly
使用 setcookie() 函数(PHP 7.3+ 推荐)
// PHP 7.3 及以上版本支持数组选项
setcookie('cookie_name', 'cookie_value', [
'expires' => time() + 3600,
'path' => '/',
'domain' => 'example.com',
'secure' => false,
'httponly' => true,
'samesite' => 'Lax'
]);
在 .htaccess 中设置(Apache)
php_value session.cookie_httponly 1
检查是否已经设置
function checkHttpOnly() {
$info = session_get_cookie_params();
return $info['httponly'] === true;
}
// 输出调试信息
var_dump(session_get_cookie_params());
示例:完整的会话设置
class SecureSession {
public static function start() {
// 设置安全的会话参数
session_set_cookie_params([
'lifetime' => 1800, // 30分钟
'path' => '/',
'domain' => $_SERVER['HTTP_HOST'],
'secure' => false, // 生产环境应设为 true
'httponly' => true, // 启用 HttpOnly
'samesite' => 'Strict' // CSRF 防护
]);
session_start();
// 可选:防止会话固定攻击
if (empty($_SESSION['generated'])) {
session_regenerate_id(true);
$_SESSION['generated'] = true;
}
}
}
// 使用
SecureSession::start();
重要注意事项
- HttpOnly 的作用:防止 JavaScript 通过
document.cookie访问 cookie,减少 XSS 攻击风险 - 默认设置:PHP 默认
php.ini中session.cookie_httponly通常为 0 - 验证设置:可以通过浏览器的开发者工具查看 cookie 的 HttpOnly 标志
- 兼容性:老版本 PHP (<7.3) 需要使用传统参数传递方式
选择哪种方法取决于你的 PHP 版本和项目的具体需求,推荐使用 session_set_cookie_params() 函数统一设置。