httponly 是防范 cookie 被 js 窃取的最基础防线,服务端设置后 document.cookie 无法读取该 cookie,但仍随请求自动发送;需配合 tls、白名单读取、权限隔离及服务端绑定校验等多层防护。

直接用 document.cookie 读取全部 Cookie,等于把钥匙串挂在门口——谁路过都能拿。动态注入脚本(比如油猴脚本、第三方 SDK、运行时加载的 JS)若未加约束,极易在不经意间触发敏感信息泄露。防范核心不是“不让读”,而是“不该读的别让它读到”。
给关键 Cookie 加上 HttpOnly 标志
这是最基础也最关键的防线。服务端设置 Cookie 时,加上 HttpOnly 属性后,该 Cookie 就无法被 JavaScript 通过 document.cookie 访问,但依然会随每次 HTTP 请求自动携带。
- 适用于:会话 ID(
sessionid)、登录态 Token、一次性 CSRF Token 等高敏感字段 - 不适用:需要前端读写的业务标识类 Cookie(如
theme=dark、lang=zh),这类应确保不含敏感逻辑 - 注意:HttpOnly 不防网络层窃听(如 HTTPS 未启用),必须配合 TLS 使用
避免脚本无差别读取所有 Cookie
很多脚本习惯性写 document.cookie 获取全部内容再解析,这是高危模式。应只读取明确需要的键名,并做最小化使用。
- 改用白名单方式提取:例如
getCookie('tracking_id'),内部用正则或split精确匹配,不碰其他字段 - 动态注入的脚本(如油猴)应在开头检查是否已存在 HttpOnly Cookie,若存在且目标字段不可读,就主动跳过后续依赖逻辑
- 禁止将
document.cookie整体作为参数发送到外部 API 或日志服务
限制动态脚本的执行上下文与权限
不是所有脚本都该拥有读取 Cookie 的能力。可通过环境隔离和策略控制缩小攻击面。
- 油猴脚本中启用
@grant none模式,禁用所有 GM_* API 和全局访问权限,仅保留必要 DOM 操作 - 使用
Content-Security-Policy的script-src限制第三方脚本来源,防止恶意脚本混入 - 对内联脚本(如
eval、setTimeout("..."))严格禁止,避免运行时拼接出读取 Cookie 的代码
服务端配合:敏感 Cookie 做绑定校验
即使 Cookie 被意外读取或劫持,服务端也可增加一层验证,让泄露的值难以复用。
- 将 Cookie 值与用户设备指纹(如 User-Agent 片段、TLS 指纹哈希)或 IP 地理粗略位置绑定,变化即失效
- 为会话 Cookie 设置较短有效期,并启用“滑动过期”(用户活跃则续期,静默则淘汰)
- 关键操作(如修改密码、转账)强制二次认证,不单依赖 Cookie 中的会话凭证
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











