我正在运行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模块列表。
答案 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
可以是 always
或 onsuccess
,根据上面链接中的描述,但是——这就是为什么破解需要这么长时间——always
实际上并不意味着“总是”:
always
不是 onsuccess
相对于现有标头的超集
更具体地说,有两个标题表,称为“always”和“onsuccess”,给定的模块可以在其中一个或两个中放置一个值,并且两个表中的所有值都将写入响应中。
>TL;DR:总是一定要编辑两个表中的标题:
Header always edit Set-Cookie (.*) "$1; HTTPOnly"
Header onsuccess edit Set-Cookie (.*) "$1; HTTPOnly"