【问题标题】:Add Secure and httpOnly Flags to Every Set-Cookie Response in Apache httpd为 Apache httpd 中的每个 Set-Cookie 响应添加 Secure 和 httpOnly 标志
【发布时间】:2014-06-09 21:16:00
【问题描述】:

我正在运行 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 服务器有标准的很长的 Apache 模块列表,可在大多数 Web 主机上找到。

【问题讨论】:

  • 可能找到了答案,但我不太确定他们在说什么:apache-http-server.18135.x6.nabble.com/… 一个 PHP 文件正在创建 cookie,它可能是配置为 CGI,我不确定。
  • 我看到了,但问题是它是 Apache 2.2.3,并且在 2.2.4 中添加了编辑。我正在运行 Apache 2.2.26 ......所以除非有办法删除编辑,否则我认为它会在那里。我想也许它是 mod_headers 的旧版本而不是 Apache 的旧版本?我必须深入研究。

标签: .htaccess security cookies httponly mod-headers


【解决方案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 标头,我在此答案顶部给出的指令应该对您有用;如果您的需求更复杂,并且我误解了您尝试使用该搜索/替换做什么,请告诉我。

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

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

...或使用两个指令:

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

第一种方法对我来说似乎更明智,但这主要是个人喜好问题。

【讨论】:

  • 嗨,我正在尝试这个 Header 总是在 Apache 2.4.6 上编辑 Set-Cookie (.*) "$1; HTTPOnly; Secure" 方法,但它似乎不起作用
  • @NullEins 需要注意的是,Secure 需要 HTTPS 才能工作。如果您在 HTTP 上使用 Secure,则 cookie 将不起作用。
  • 看看我是否做对了。在我的 htacess 中,我添加了这一行 Header always edit Set-Cookie (.*) "$1; HTTPOnly; Secure"?我有很多错误prnt.sc/pehmj8
  • 非常感谢这个解决方案。它完美地工作。对于那些寻找在全站点范围内应用但排除特定 cookie 的解决方案的人,请阅读此处:stackoverflow.com/questions/41173890/edit-cookie-httponly-value
  • 我怎样才能只为特定的cookie编辑标题Set-Cookie,即我只想为cookie名称_jsessionid添加HttpOnly, Secure
【解决方案2】:

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

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"

【讨论】:

  • 谢谢,拯救了我的一天
  • 谢谢你,在我看到你的回答之前我以为我快疯了。
  • 我认为设计这个系统的人很疯狂,但是,不客气 :D
【解决方案3】:

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

这对我有用:

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

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

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

希望对你有帮助。

【讨论】:

  • 看看我是否做对了。在我的 htacess 中,我添加了这一行 Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure;SameSite=strict?我有很多错误prnt.sc/pehmj8
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

    确保 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 
    

    然后重启服务器

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-10
      • 1970-01-01
      • 2013-02-13
      • 2023-03-17
      • 2020-03-15
      • 1970-01-01
      • 2020-03-11
      • 2013-07-19
      相关资源
      最近更新 更多