22

我正在运行 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 模块列表。

4

5 回答 5

54

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 editSet-Cookie

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

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

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

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

...或使用两个指令:

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

第一种方法对我来说似乎更明智,但这在很大程度上是一个品味问题。

于 2014-06-16T14:52:34.820 回答
8

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

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"
于 2021-05-28T13:39:29.013 回答
4

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

这对我有用:

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

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

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

希望能帮助到你。

于 2019-03-20T09:24:32.367 回答
4

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

Header always edit Set-Cookie "^((?!;\s?[Ss]ecure).)+$" "$0; Secure"
于 2020-03-06T23:05:31.503 回答
0

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

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

对于低于 Apache 2.2.4 的版本,请使用以下内容:

Header set Set-Cookie HttpOnly;Secure 

然后重启服务器

于 2019-07-09T09:09:31.967 回答