运行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模块列表。
6条答案
按热度按时间gpfsuwkq1#
Header edit
指令在应用程序生成响应之前 * 运行,因此如果应用程序正在生成您想要编辑的标头,则在指令运行时该标头还不存在,并且没有任何内容可供编辑。你可以通过使用
Header always edit
(在你的应用程序产生响应后运行)来解决这个问题:字符串
一个示例头,在应用指令之前:
型
应用指令后的相同头:
型
我不确定你的问题中的指令到底是什么意思;当改变为
Header always edit
时,它们 * 实际上 * 的结果(假设与我上面的示例中相同的Set-Cookie
报头)是例如。型
如果您了解正则表达式和反向引用是如何工作的,那么很明显那里发生了什么,但可能这不是您想要的。我在这个答案的顶部给出的指令应该对你有用,如果你想把标志添加到每个
Set-Cookie
头中;如果您的需求更复杂,而我误解了您尝试使用搜索/替换的目的,请告诉我。**编辑:**如果不是很明显:要添加 both 标志,您可以像这样修改指令:
型
...或使用两个指令:
型
第一种方法对我来说似乎更明智,但这在很大程度上是一个品味问题。
stszievb2#
六年后,我可能已经解决了这个问题。
Header
指令由mod_headers
提供,结构为Header {condition} {action} {header name} {match} {replacement}
。我还没有看到任何人在其他答案中提到的关键是第一个变量,condition
。根据上面链接中的描述,
condition
可以是always
或onsuccess
,但是-这就是为什么花了这么长时间才破解-always
* 实际上并不意味着“总是”*:always
不是onsuccess
相对于现有标头的超集更具体地说,有两个名为“always”和“onsuccess”的头表,给定的模块可以在其中一个或两个表中放置一个值,并且两个表中的所有值都将写入响应中。
TL;DR:始终确保编辑两个表中的标题:
字符串
disbfnqx3#
我试图在cookie上设置http,secure和samesite=strict。
这对我很有效:
字符串
Samesite=strict提供针对XSRF的保护。
型
希望对你有帮助。
yacmzcpb4#
这将只将标记添加到需要它的cookie中:
字符串
2uluyalo5#
请确认mod_headers.so已启用,然后在apache2.conf(基于debian的系统)或httpd.conf(基于rpm的系统)中添加以下头文件
字符串
对于低于Apache 2.2.4的版本,请使用以下命令:
型
然后重启服务器
bybem2ql6#
大多数提供的答案,可以在网上找到这个问题通常失败的4件事:
HttpOnly
,Secure
,SameSite=…
如果已经存在,则不应再次附加到Set-cookie头中。(你认为Web浏览器应该如何解释像Set-Cookie: mycookie=foo; SameSite=Lax; SameSite=Strict
=>这样的东西,是宽松的还是严格的??)1.如果使用
HTTPS
,Secure
是一件好事,但如果使用HTTP
,它将完全破坏cookie,因此我们应该有条件地只在HTTPS
连接上添加此关键字。1.(几乎?)没有人真正知道我们应该只使用
Header edit
或Header always edit
或Header onsuccess edit
或两者兼而有之(对Apache糟糕的文档感到羞耻!))1.在一个理想的世界里,它应该是网络开发人员的责任,把适当的安全关键字,每当他们在他们的网站上创建cookie。
Header set Set-Cookie
技巧在这里只是为了加强Apache Web服务器的安全性,以防开发人员没有正确地完成他们的工作(但这从来没有发生过,不是吗?:-p)。因此,你不应该破坏一个好的开发者所做的工作(他在创建他/她的cookie时花时间放置正确的SameSite=…
值),用SameSite=strict
覆盖它,这将破坏整个Web应用程序。(我给予个例子:对于CAS服务器上的单点登录,您必须将会话cookie设置为SameSite=lax
,否则它根本无法工作)这里有一个解决所有这些问题的工作解决方案:
字符串
(这些行已经在Apache 2.4.56上测试过。
<If>
条件需要Apache 2.4或更高版本。除此之外,其余部分应与Apache 2.2.4或更高版本一起使用)