Nginx 向来自代理服务器的 Cookie 添加安全标志

ST-*_*DDT 14 configuration nginx

Mozilla 刚刚发布了一个新工具来检查您的网站配置。observatory.mozilla.org

但是扫描抱怨 Cookies(-10 分):会话 cookie 设置没有安全标志......

不幸的是,在我的 nginx 后面运行的服务只能设置安全标头,如果 SSL 直接在那里终止,而不是当 SSL 在 nginx 上终止时。因此,cookie 上没有设置“安全”标志。

是否可以使用 nginx 以某种方式将“安全”标志附加到 cookie 中?修改位置/路径似乎是可能的。

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cookie_domain

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cookie_path

Lar*_*rry 13

我知道有两种方法可以做到这一点,但都不是很好。第一种是像这样滥用 proxy_cookie_path:

proxy_cookie_path / "/; secure";
Run Code Online (Sandbox Code Playgroud)

第二种是使用Headers More 模块中的 more_set_headers 指令,如下所示:

more_set_headers 'Set-Cookie: $sent_http_set_cookie; secure';
Run Code Online (Sandbox Code Playgroud)

这两者都会引入问题,因为它们盲目地添加项目。例如,如果上游设置了安全标志,您将最终向客户端发送这样的副本:

Set-Cookie: foo=bar; secure; secure;
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,如果上游应用程序没有设置 cookie,nginx 会将其发送到浏览器:

Set-Cookie; secure;
Run Code Online (Sandbox Code Playgroud)

当然,这是双重加不好。

我认为这个问题需要解决,因为很多人都问过这个问题。在我看来,需要这样的指令:

proxy_cookie_set_flags * HttpOnly;
proxy_cookie_set_flags authentication secure HttpOnly;
Run Code Online (Sandbox Code Playgroud)

但唉,这目前不存在:(


小智 5

尝试使用nginx_cookie_flag_module。它将解决您的问题。

免责声明:我是该模块的作者。

  • 您能否详细说明如何设置和配置模块。README 似乎表明它需要重建 nginx,这在许多设置中可能是不可接受的。 (5认同)