如何在tomcat / java webapps中配置HttpOnly cookie?

2022-08-31 13:01:17

在阅读了Jeff关于保护你的Cookie的博客文章后:HttpOnly。我想在我的 Web 应用程序中实现 HttpOnly Cookie。

你如何告诉tomcat只使用http cookie进行会话?


答案 1

httpOnly 从 Tomcat 6.0.19 和 Tomcat 5.5.28 开始受支持。

请参阅 bug 44382 的更改日志条目。

bug 44382 的最后一条评论指出,“这已应用于 5.5.x,并将包含在 5.5.28 以后的版本中。但是,似乎尚未发布5.5.28。

可以在 conf/context 中的所有 web 应用程序启用 httpOnly 功能.xml:

<Context useHttpOnly="true">
...
</Context>

我的解释是,它也适用于单个上下文,方法是在conf/server.xml中将其设置为所需的上下文条目(以与上述相同的方式)。


答案 2

更新:这里的JSESSIONID内容仅适用于较旧的容器。请使用 jt 当前接受的答案,除非您使用的是< Tomcat 6.0.19 或 < Tomcat 5.5.28 或其他不支持 HttpOnly JSESSIONID cookie 的容器作为配置选项。

在应用中设置 Cookie 时,请使用

response.setHeader( "Set-Cookie", "name=value; HttpOnly");

但是,在许多Web应用程序中,最重要的cookie是会话标识符,它由容器自动设置为JSESSIONID cookie。

如果您只使用此 cookie,则可以编写一个 ServletFilter 来在退出时重新设置 Cookie,从而强制 JSESSIONID 使用 HttpOnly。http://keepitlocked.net/archive/2007/11/05/java-and-httponly.aspx http://alexsmolen.com/blog/?p=16 的页面建议在筛选器中添加以下内容。

if (response.containsHeader( "SET-COOKIE" )) {
  String sessionid = request.getSession().getId();
  response.setHeader( "SET-COOKIE", "JSESSIONID=" + sessionid 
                      + ";Path=/<whatever>; Secure; HttpOnly" );
} 

但请注意,这将覆盖所有cookie,并且仅设置您在此过滤器中声明的内容。

如果您在 JSESSIONID Cookie 中使用其他 Cookie,则需要扩展此代码以设置筛选器中的所有 Cookie。在多 cookie 的情况下,这不是一个很好的解决方案,但对于仅 JSESSIONID 设置来说,这可能是一个可以接受的快速修复。

请注意,随着您的代码随着时间的推移而发展,当您忘记此过滤器并尝试在代码中的其他位置设置另一个cookie时,会有一个令人讨厌的隐藏错误等着您。当然,它不会被设置。

不过,这真的是一个黑客。如果你确实使用Tomcat并且可以编译它,那么看看Shabaz的优秀建议,将HttpOnly支持补丁到Tomcat中。