PHP Cookie 安全面试题

4次阅读

php cookie安全核心在于正确设置四大属性:secure(仅https传输)、httponly(禁js访问)、samesite(防csrf)、expires/max-age(设短时效);服务端须校验cookie完整性,禁止明文存敏感信息,敏感操作需二次验证。

PHP Cookie 安全面试题

PHP Cookie 安全的核心风险点

Cookie 是服务端写入客户端的一小段数据,天然暴露在用户可控环境中。PHP 中若未正确设置 Cookie 属性,极易引发会话劫持、xss 劫持、CSRF 辅助攻击等问题。关键不在于“是否用 Cookie”,而在于“怎么设、怎么读、怎么保护”。

必须启用的四大安全属性

PHP 7.3+ 推荐使用 setcookie() 的数组参数形式,显式声明安全选项:

  • Secure:仅通过 HTTPS 传输,防止明文窃听(开发环境可临时禁用,生产环境必须开启)
  • HttpOnly:禁止 JavaScript 访问,大幅降低 XSS 后 Cookie 泄露风险
  • Samesite:推荐设为 StrictLax,防御 CSRF(PHP 7.3+ 原生支持,低版本需手动拼 header)
  • Expires/Max-Age:避免永不过期;敏感 Cookie(如登录态)建议短时效 + 服务端二次校验

服务端验证不能只信 Cookie 值

Cookie 可被用户任意修改,$_COOKIE 仅作输入看待,绝不可直接用于权限判断或数据库查询:

  • 登录态应绑定 session_id + 用户代理指纹 + IP 段(非精确匹配,防频繁切换)
  • 敏感操作(如改密码、删账号)必须重新验证密码或短信 Token,不能仅凭 Cookie 存在就放行
  • 避免将用户 ID、角色等明文存 Cookie;如需存储,应签名(hash_hmac)或加密(openssl_encrypt),且服务端严格校验完整性

常见误操作与修复示例

以下写法存在明显风险,应立即调整:

立即学习PHP免费学习笔记(深入)”;

  • 危险setcookie('user_id', $_GET['id']); —— 未过滤、未签名、无 HttpOnly
  • 危险echo $_COOKIE['theme']; —— 未转义直接输出,可能触发 XSS
  • 推荐setcookie('auth_token', $token, ['expires' => time() + 3600, 'path' => '/', 'domain' => '.example.com', 'secure' => true, 'httponly' => true, 'samesite' => 'Lax']);
  • 推荐:读取前先检查 isset($_COOKIE['auth_token']) && hash_equals($expected_hash, $_COOKIE['auth_token'])
text=ZqhQzanResources