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

时间:2014-06-09 21:16:00

标签: .htaccess security cookies 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

我尝试使用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"

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

5 个答案:

答案 0 :(得分:26)

{/ 1}}指令在应用程序生成响应之前运行,因此如果应用程序正在生成您要编辑的标题,那么该标题在当时还不存在该指令运行,并且没有任何内容可供编辑。

您可以使用Header edit(在您的应用程序生成响应后运行)来解决此问题:

Header always edit

示例标题,在应用指令之前:

Header always edit Set-Cookie (.*) "$1; HTTPOnly"

应用指令后的相同标题:

Set-Cookie: foo=bar; domain=.example.com; path=/

我不确定你问题中的指令究竟是什么意思;当他们改为Set-Cookie: foo=bar; domain=.example.com; path=/; HTTPOnly 时(假设与我上面的例子中的Header always edit标题相同),他们实际的结果就是这样。

Set-Cookie

如果您了解正则表达式和反向引用是如何工作的,那么它在那里发生的事情显而易见,但可能不是您想要的。如果你正如你所说的那样,你想在每个Set-Cookie: f ;HTTPOnlyo=bar; domain=.example.com; path=/ 标题中添加标记,那么我在这个答案的顶部给出的指令应该对你有用。如果您的需求更加复杂,并且我误解了您尝试使用该搜索/替换的内容,请与我联系。

编辑:如果不明显:添加两个标志,您可以像这样修改指令:

Set-Cookie

...或使用两个指令:

Header always edit Set-Cookie (.*) "$1; HTTPOnly; Secure"

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

答案 1 :(得分:1)

这会将标签仅添加到需要它的cookie中:

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

答案 2 :(得分:0)

我试图在Cookie上设置http,secure和samesite = strict。

这对我有用:

Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure

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

Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure;SameSite=strict

希望有帮助。

答案 3 :(得分:0)

确保启用 mod_headers.so ,然后在apache2.conf中添加以下标头(对于基于debian的系统)或httpd.conf(对于基于rpm的系统)

 Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure

对于低于Apache 2.2.4的版本,请使用以下命令:

Header set Set-Cookie HttpOnly;Secure 

然后重新启动服务器

答案 4 :(得分:0)

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

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

condition 可以是 alwaysonsuccess,根据上面链接中的描述,但是——这就是为什么破解需要这么长时间——always 实际上并不意味着“总是”

<块引用>

always 不是 onsuccess 相对于现有标头的超集

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

>

TL;DR:总是一定要编辑两个表中的标题:

Header always edit Set-Cookie (.*) "$1; HTTPOnly"
Header onsuccess edit Set-Cookie (.*) "$1; HTTPOnly"