使用 Apache mod_header 为所有 cookie 提供 HttpOnly 和安全 cookie

Jos*_*ial 5 cookie apache-2.2

我在网站上使用 Apache 2.2.29。apache 既可以为来自 Drupal 的页面提供服务,也可以作为内部应用程序服务器的反向代理。出于安全原因,我们希望为发送给客户端的所有 cookie 添加标志 HttpOnly 和安全。为了做到这一点,我在 apache 中设置了以下规则

Header edit Set-Cookie "(?i)^((?:(?!;\s?HttpOnly).)+)$" "$1; HttpOnly"
Header edit Set-Cookie "(?i)^((?:(?!;\s?secure).)+)$" "$1; secure"
Run Code Online (Sandbox Code Playgroud)

对于某些 cookie,这工作正常,但其他 cookie 没有被修改。查看响应标题,我看到以下内容:

HTTP/1.1 200 OK
Date: Thu, 20 Nov 2014 22:50:01 GMT
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Last-Modified: Thu, 20 Nov 2014 22:50:01 GMT
Cache-Control: store, no-cache, must-revalidate
Cache-Control: post-check=0, pre-check=0
Set-Cookie: SESSbfb02014bca2e49545c2cacd8a8cfcfa=perqn1l3mn2saselmabnn4vla7; expires=Sun, 14-Dec-2014 02:23:21 GMT; path=/; domain=.www6.server.com; HttpOnly; secure
Set-Cookie: textsize=100; expires=Fri, 20-Nov-2015 22:50:02 GMT; path=/; HttpOnly; secure
X-Cnection: close
Content-Type: text/html; charset=utf-8
Set-Cookie: TS01bd748d=015ca10fb56fc0a5579c6ad014a58a39be63cd86225d41d272c4e99ff818001921bf8a6afe8ff8786edc26a530281a2446ac250c26; Path=/
Set-Cookie: TS01ccb021=015ca10fb57273008302fba8649a42c6cd81f3c49f372d5d34fa4c31fc345f6be3c40dff1b5db114bd54174903e671f755744110dd; path=/; domain=.server.com
Set-Cookie: TS01bd748d_28=01d8892cb5da9e13891c7af98cab63f3bea0d8549b995c92d87d9b10240fcf906df41411935b1d5db889e1e5178debe05972be3916; Path=/
Content-Length: 39891

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
Run Code Online (Sandbox Code Playgroud)

只有前两个 cookie 正在被修改以具有标志。其他三个不是。它们似乎设置得更晚,或者至少它们出现在前两个之后。我不知道为什么这会有所不同,但似乎确实如此。有关如何修复它们的任何建议?

Fed*_*rra 7

也许问题在于Header edit指令在您的应用程序产生响应之前运行,因此如果应用程序正在生成您要编辑的标头,则该标头在指令运行时尚不存在。

根据文档:

Header[条件]set|append|merge|add|unset|echo|edit header [value] [replacement] [early|env=[!]variable]

可选条件参数确定该指令将针对哪个内部响应标头表进行操作。服务器的其他组件可能已将其响应头存储在对应onsuccess的表或始终对应的表中。"Always"在此上下文中是指您添加的标头是否会在成功和不成功的响应期间发送,但如果您的操作是现有标头的函数,则必须继续阅读以了解进一步的复杂性。

onsuccess在类似于下面列出的情况下,可能需要将的默认值更改为始终。另请注意,在某些情况下,在两个条件下重复此指令是有意义的,因为对于现有标头而言,始终不是 onsuccess 的超集:

  • 您正在向非成功(非 2xx)响应(例如重定向)添加标头,在这种情况下,最终响应中仅使用与 always 对应的表。
  • 您正在修改或删除由 CGI 脚本生成的标题,在这种情况下,CGI 脚本位于与 always 相对应的表中,
    而不是在默认表中。
  • 您正在修改或删除由服务器的某些部分生成的标头,但默认的 onsuccess 条件找不到该标头。

参考:http : //httpd.apache.org/docs/2.2/mod/mod_headers.html

您可以使用Header always edit.

例如。

Header always edit Set-Cookie "(?i)^((?:(?!;\s?HttpOnly).)+)$" "$1; HttpOnly"
Header always edit Set-Cookie "(?i)^((?:(?!;\s?secure).)+)$" "$1; secure"
Run Code Online (Sandbox Code Playgroud)

我希望这会有所帮助。