在Apache httpd中为每个Set-Cookie响应添加Secure和httpOnly标志

Dou*_*oug 15 security cookies .htaccess httponly mod-headers

我正在运行Apache 2.2.26:

Server version: Apache/2.2.26 (Unix)
Server built:   Jan 17 2014 12:24:49
Cpanel::Easy::Apache v3.22.30 rev9999 +cloudlinux
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用mod_headers来编辑Set-Cookie标头并添加安全或httpOnly标志,但它根本不起作用(什么都不做,不会给出HTTP 500错误).

我可以使用"修改""附加",Header命令的指令没有问题,只是没有编辑.我不知道为什么...

我尝试了很多组合,但这就是我在.htaccess中所拥有的:

Header edit Set-Cookie "(.)([Hh][Tt][Tt][Pp][Oo][Nn][Ll][Yy])?(.)" "$1$2 ;HTTPOnly"
Header edit Set-Cookie "(.)([Ss][Ee][Cc][Uu][Rr][Ee])?(.)" "$1$2 ;Secure"
Run Code Online (Sandbox Code Playgroud)

我愿意接受任何自动将标志添加到每个Set-Cookie响应的解决方案,而无需在应用程序中编辑代码.我无权在Web服务器上安装其他项目,但Web服务器具有在大多数Web主机上找到的标准的很长的Apache模块列表.

Zer*_*eus 35

Header edit指令您的应用程序生成响应之前运行,因此如果应用程序正在生成您要编辑的标题,那么该指令在指令运行时将不存在,并且没有任何内容可供编辑.

您可以通过使用Header always edit(应用程序生成响应运行)来修复此问题:

Header always edit Set-Cookie (.*) "$1; HTTPOnly"
Run Code Online (Sandbox Code Playgroud)

应用指令之前的示例标头:

Set-Cookie: foo=bar; domain=.example.com; path=/
Run Code Online (Sandbox Code Playgroud)

应用指令后的相同标头:

Set-Cookie: foo=bar; domain=.example.com; path=/; HTTPOnly
Run Code Online (Sandbox Code Playgroud)

我不确定你问题中的指令究竟是做什么的; 它们实际上在改变时产生的结果Header always edit(假设与Set-Cookie我上面例子中相同的标题)是例如

Set-Cookie: f ;HTTPOnlyo=bar; domain=.example.com; path=/
Run Code Online (Sandbox Code Playgroud)

如果您了解正则表达式和反向引用是如何工作的,那么很明显发生了什么,但可能不是您想要的.如果正如你所说,你想在每个Set-Cookie标题中添加标志,那么我在这个答案的顶部给出的指令应该对你有用.如果您的需求更加复杂,而且我误解了您尝试使用该搜索/替换的内容,请告诉我们.

编辑:如果不明显:要添加两个标志,您可以修改指令,如下所示:

Header always edit Set-Cookie (.*) "$1; HTTPOnly; Secure"
Run Code Online (Sandbox Code Playgroud)

......或使用两个指令:

Header always edit Set-Cookie (.*) "$1; HTTPOnly"
Header always edit Set-Cookie (.*) "$1; Secure"
Run Code Online (Sandbox Code Playgroud)

第一种方法对我来说似乎更明智,但它主要是品味问题.


Cod*_*rer 11

六年后,我可能已经解决了这个问题。

Header指令由 提供mod_headers,结构如下Header {condition} {action} {header name} {match} {replacement}。我没有看到任何人在其他答案中提出的关键是第一个变量condition.

condition可以是alwaysor onsuccess,根据上面链接中的描述,但是 - 这就是为什么花了这么长时间来破解 -always 实际上并不意味着“总是”

always不是onsuccess现有标头的超集

更具体地说,有两个标头表,称为“always”和“onsuccess”,给定模块可以在其中一个或两个中放入一个值,并且两个表中的所有值都将写入响应中。

TL;DR:始终确保编辑两个表中的标题:

Header always edit Set-Cookie (.*) "$1; HTTPOnly"
Header onsuccess edit Set-Cookie (.*) "$1; HTTPOnly"
Run Code Online (Sandbox Code Playgroud)


Sah*_*dhi 7

我试图在 cookie 上设置 http、secure 和 Samesite=strict 。

这对我有用:

Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure
Run Code Online (Sandbox Code Playgroud)

Samesite=strict 提供针对 XSRF 的保护。

Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure;SameSite=strict
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你。


小智 5

这只会将标签添加到那些需要它的 cookie 中:

Header always edit Set-Cookie "^((?!;\s?[Ss]ecure).)+$" "$0; Secure"
Run Code Online (Sandbox Code Playgroud)