我正在使用Apache 2.2.29的网站。 Apache既可以为Drupal提供页面,也可以作为内部应用程序服务器的反向代理。 出于安全考虑,我们希望将标志HttpOnly添加到所有发送给客户端的cookie中。 为了做到这一点,我已经在Apache中设置了以下规则
Header edit Set-Cookie "(?i)^((?:(?!;\s?HttpOnly).)+)$" "$1; HttpOnly" Header edit Set-Cookie "(?i)^((?:(?!;\s?secure).)+)$" "$1; secure"
而且,对于一些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">
只有前两个cookie被修改才能有标志。 其他三个不是。 他们似乎在稍后设置,或者至less在前两个之后出现。 我不知道为什么这有所作为,但似乎这样做。 有关如何解决这些问题的build议?
也许问题是在应用程序产生响应之前运行Header edit指令,所以如果应用程序正在产生你想要编辑的头文件,那么在指令运行的时候头文件还不存在。
根据文件:
Header[ condition ]set|append|merge|add|unset|echo|edit header [value] [replacement] [early|env=[!]variable]可选的条件参数决定了这个指令对哪个内部表格的响应标题。 服务器的其他组件可能已将响应标头存储在对应于
onsuccess的表中,或者对应于始终的表中。 在这种情况下,"Always"是指在添加标题时,是否会在成功和未成功的响应中发送标题,但是如果您的操作是现有标题的function,则需要继续阅读。
onsuccess的默认值可能需要更改为总是在类似于下面列出的情况下。 还要注意,在两种情况下重复使用这个指令是有意义的,因为在现有的头文件中总是不是onsuccess的超集。
- 您正在向非成功(非2xx)响应(例如redirect)添加标头,在这种情况下,只有与始终对应的表才能用于最终响应。
- 您正在修改或删除由CGI脚本生成的头文件,在这种情况下,CGI脚本在始终对应的表中
而不是在默认表中。- 您正在修改或删除由某个服务器部分生成的标头,但该标头在默认的onsuccess条件中找不到。
REF: 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"
我希望这个帮助。