CRIME针对TLS压缩,BREACH针对HTTP压缩;Nginx需禁用TLS压缩(ssl_options no_tls_compression)和敏感路径Gzip(gzip off),并分离可控输入与敏感数据、限速及绑定Token。

CRIME 和 BREACH 是两类不同的侧信道攻击,都利用压缩机制泄露敏感信息,但发生位置和应对方式完全不同。Nginx 本身不能“自动防御”它们,但可通过精准禁用对应压缩层 + 配合响应行为调整,大幅降低风险。
明确区分:CRIME 针对 TLS 层,BREACH 针对 HTTP 层
CRIME 利用的是 TLS 协议内置的压缩(如 DEFLATE),通过观察加密后密文长度变化推测 Cookie 等内容;BREACH 则利用的是 Nginx 开启的 HTTP 响应体 Gzip 压缩,当用户可控输入(如 URL 参数)与响应中敏感数据(如 CSRF Token)共存时,攻击者可逐字节恢复秘密。
现代浏览器已默认禁用 TLS 压缩,且主流 Nginx(1.15.0+)编译时也不启用 TLS 压缩功能。因此实际需重点防控的是 BREACH。
禁用敏感路径的 Gzip 压缩(防 BREACH 核心措施)
不是全局关 Gzip,而是对含敏感数据的动态响应关闭压缩:
- 在
server或location块中显式设置gzip off;,例如登录页、仪表盘、API 接口等 - 对
/api/类路径统一关闭:location /api/ { gzip off; proxy_pass http://backend; } - 若需压缩静态资源,用
gzip_types精确限定范围,避开 HTML、JSON、XML:gzip_types application/javascript text/css image/svg+xml;
补充关键缓解手段(消除 BREACH 前提)
仅关 Gzip 不够,还需打破“可控输入 + 敏感数据同响应”的组合:
- 避免将 CSRF Token、Session ID 直接写入 HTML body;改用
HttpOnlyCookie 或由前端通过独立 AJAX 请求获取 - 对高敏感接口(如含 token 的页面)启用限速,例如:
limit_req zone=api burst=5 nodelay;,提高攻击成本 - 确保后端生成的 Token 绑定 IP 或 User-Agent,缩短其有效窗口,让攻击者来不及完成试探
额外注意:HTTP/2 的 HPACK 头部压缩风险
若已启用 http2,HPACK 头部压缩可能被用于推断 Cookie 或 Authorization 字段。虽无通用 Nginx 配置可完全禁用 HPACK,但可:
- 避免在响应头中重复携带高敏感字段(如动态刷新 Cookie)
- 限制单连接请求数量,减少动态字典积累机会
- 结合 TLS 配置禁用弱协议(TLS 1.0/1.1)和不安全套件,降低整体攻击面


















