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

v9tzhpje  于 2023-08-06  发布在  Apache
关注(0)|答案(6)|浏览(339)

运行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标头并添加secure或httpOnly标志,但它根本不起作用(什么也不做,不给予HTTP 500错误)。
我可以使用“修改”“附加”,标题命令的指令没有问题,只是没有编辑。我不知道为什么。
我试过很多组合,但这是我在我的.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模块列表。

gpfsuwkq

gpfsuwkq1#

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头中;如果您的需求更复杂,而我误解了您尝试使用搜索/替换的目的,请告诉我。

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

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


...或使用两个指令:

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


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

stszievb

stszievb2#

六年后,我可能已经解决了这个问题。
Header指令由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"

字符串

disbfnqx

disbfnqx3#

我试图在cookie上设置http,secure和samesite=strict。
这对我很有效:

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

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

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


希望对你有帮助。

yacmzcpb

yacmzcpb4#

这将只将标记添加到需要它的cookie中:

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

字符串

2uluyalo

2uluyalo5#

请确认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


然后重启服务器

bybem2ql

bybem2ql6#

大多数提供的答案,可以在网上找到这个问题通常失败的4件事:

  1. HttpOnlySecureSameSite=…如果已经存在,则不应再次附加到Set-cookie头中。(你认为Web浏览器应该如何解释像Set-Cookie: mycookie=foo; SameSite=Lax; SameSite=Strict =>这样的东西,是宽松的还是严格的??)
    1.如果使用HTTPSSecure是一件好事,但如果使用HTTP,它将完全破坏cookie,因此我们应该有条件地只在HTTPS连接上添加此关键字。
    1.(几乎?)没有人真正知道我们应该只使用Header editHeader always editHeader onsuccess edit或两者兼而有之(对Apache糟糕的文档感到羞耻!))
    1.在一个理想的世界里,它应该是网络开发人员的责任,把适当的安全关键字,每当他们在他们的网站上创建cookie。Header set Set-Cookie技巧在这里只是为了加强Apache Web服务器的安全性,以防开发人员没有正确地完成他们的工作(但这从来没有发生过,不是吗?:-p)。因此,你不应该破坏一个好的开发者所做的工作(他在创建他/她的cookie时花时间放置正确的SameSite=…值),用SameSite=strict覆盖它,这将破坏整个Web应用程序。(我给予个例子:对于CAS服务器上的单点登录,您必须将会话cookie设置为SameSite=lax,否则它根本无法工作)

这里有一个解决所有这些问题的工作解决方案:

Header onsuccess edit Set-Cookie ^(.*(?i:HttpOnly).*)$ ;;;HttpOnly_ALREADY_SET;;;$1
Header onsuccess edit Set-Cookie ^((?!;;;HttpOnly_ALREADY_SET;;;).*)$ $1;HttpOnly
Header onsuccess edit Set-Cookie ^(?:;;;HttpOnly_ALREADY_SET;;;)(.*)$ $1
Header always edit Set-Cookie ^(.*(?i:HttpOnly).*)$ ;;;HttpOnly_ALREADY_SET;;;$1
Header always edit Set-Cookie ^((?!;;;HttpOnly_ALREADY_SET;;;).*)$ $1;HttpOnly
Header always edit Set-Cookie ^(?:;;;HttpOnly_ALREADY_SET;;;)(.*)$ $1

Header onsuccess edit Set-Cookie ^(.*(?i:SameSite=).*)$ ;;;SameSite_ALREADY_SET;;;$1
Header onsuccess edit Set-Cookie ^((?!;;;SameSite_ALREADY_SET;;;).*)$ $1;SameSite=strict
Header onsuccess edit Set-Cookie ^(?:;;;SameSite_ALREADY_SET;;;)(.*)$ $1
Header always edit Set-Cookie ^(.*(?i:SameSite=).*)$ ;;;SameSite_ALREADY_SET;;;$1
Header always edit Set-Cookie ^((?!;;;SameSite_ALREADY_SET;;;).*)$ $1;SameSite=strict
Header always edit Set-Cookie ^(?:;;;SameSite_ALREADY_SET;;;)(.*)$ $1

<If "%{HTTPS} == 'on'">
  Header onsuccess edit Set-Cookie ^(.*(?i:Secure).*)$ ;;;Secure_ALREADY_SET;;;$1
  Header onsuccess edit Set-Cookie ^((?!;;;Secure_ALREADY_SET;;;).*)$ $1;Secure
  Header onsuccess edit Set-Cookie ^(?:;;;Secure_ALREADY_SET;;;)(.*)$ $1
  Header always edit Set-Cookie ^(.*(?i:Secure).*)$ ;;;Secure_ALREADY_SET;;;$1
  Header always edit Set-Cookie ^((?!;;;Secure_ALREADY_SET;;;).*)$ $1;Secure
  Header always edit Set-Cookie ^(?:;;;Secure_ALREADY_SET;;;)(.*)$ $1
</If>

字符串
(这些行已经在Apache 2.4.56上测试过。<If>条件需要Apache 2.4或更高版本。除此之外,其余部分应与Apache 2.2.4或更高版本一起使用)

相关问题