HTTPS不免疫侧信道攻击;CRIME利用TLS压缩,BREACH利用HTTP压缩,需分别禁用TLS压缩(ssl_options no_tls_compression)和敏感路径Gzip(gzip off),并配合分离敏感数据、限速等措施。

HTTPS 本身不免疫侧信道攻击。CRIME 和 BREACH 都利用 TLS 加密层外的可观察行为(如响应长度、压缩率)来推测敏感内容,但两者机制不同、应对方式也需区分处理。Nginx 无法单靠配置“完全阻止”这类攻击,但可通过禁用风险组件 + 调整响应行为显著降低利用可能性。
禁用 TLS 层压缩(防 CRIME)
CRIME 攻击依赖 TLS 层启用的压缩(如 DEFLATE),通过观察加密后密文长度变化推断 Cookie 等秘密。现代浏览器已默认禁用 TLS 压缩,且主流 Nginx 版本(1.15.0+)编译时默认不启用该功能。确认与加固方式如下:
- 检查 OpenSSL 编译选项:运行 nginx -V 2>&1 | grep -o "with-openssl",若输出含 no-tls-compression 或未启用 zlib,则 TLS 压缩本就关闭
- Nginx 配置中无需显式指令,但可在 server 块中添加明确禁用(兼容旧环境):
ssl_options no_tls_compression; - 验证方法:用 openssl s_client -connect example.com:443 -tls1_2 连接后查看输出,若无 Compression: NONE 以外的提示,说明安全
禁用 HTTP 层 Gzip 压缩(防 BREACH)
BREACH 利用的是 HTTP 响应体的 Gzip 压缩(非 TLS 层),当页面含用户可控输入(如搜索词、URL 参数)且响应中又包含敏感数据(如 CSRF Token、Session ID)时,攻击者可通过反复提交构造参数,比对压缩后响应长度,逐字节恢复秘密。
- 最有效手段是关闭对敏感路径的 Gzip:
在对应 location 块中设置 gzip off;,例如登录页、API 接口、含 Token 的 HTML 页面 - 若必须压缩静态资源(JS/CSS),可用 gzip_types 精确控制范围,避免压缩 HTML/JSON:
gzip_types application/javascript text/css; - 对动态接口(如 /api/),建议统一关闭 Gzip:
location /api/ { gzip off; proxy_pass http://backend; }
补充缓解措施(降低 BREACH 可利用性)
即使禁用压缩,仍需配合其他策略消除攻击前提:
- 分离敏感数据与用户输入:避免将 CSRF Token、Session ID 等直接嵌入 HTML body;改用 HTTP-only Cookie 或独立 AJAX 请求获取
- 添加随机字节噪声(不推荐生产):通过 sub_filter 或后端注入随机长度的注释,干扰压缩率判断;但会增加带宽和解析开销,仅作临时缓解
- 启用 CSRF Token 绑定 IP/UA:使 Token 失效更快,缩短攻击窗口;需后端逻辑支持,Nginx 仅作反向代理时不介入
- 限制请求速率:BREACH 需大量请求试探,用 limit_req 控制单 IP 对敏感路径的访问频次,提高攻击成本
不要混淆的常见误区
有些方案误以为“升级 TLS 版本”或“调整 cipher suite”能防 BREACH —— 实际上它与协议版本、密钥交换方式无关,只取决于是否启用 HTTP 压缩 + 是否存在“可控输入 + 隐蔽输出”的组合。同样,server_tokens off 或隐藏 Server 头对这两种攻击毫无作用。


















