当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在tomcat/javawebapps中配置HttpOnlycookie?》经验,为你挑选了5个好方法。

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

你怎么告诉tomcat只使用http的会话?



1> jt...:

从Tomcat 6.0.19和Tomcat 5.5.28开始支持httpOnly.

有关错误44382,请参阅changelog条目.

错误44382的最后评论指出,"这已经应用于5.5.x并将包含在5.5.28之后." 但是,似乎没有发布5.5.28.

可以为conf/context.xml中的所有webapp启用httpOnly功能:


...

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



2> Cheekysoft..:

更新:此处的JSESSIONID内容仅适用于旧容器.除非您使用

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

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

但是,在许多webapps中,最重要的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=/; Secure; HttpOnly" );
} 

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

如果您对JSESSIONID cookie使用其他cookie,则需要扩展此代码以设置过滤器中的所有cookie.对于多cookie而言,这不是一个很好的解决方案,但对于仅限JSESSIONID的设置来说,这可能是一个可接受的快速修复方法.

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

这真的是一个黑客.如果您确实使用Tomcat并且可以编译它,那么请看看Shabaz的优秀建议,即将HttpOnly支持修补到Tomcat中.


此代码删除; Secure标志,从而使https的使用毫无意义.

3> Hendrik Brum..:

请注意不要覆盖https-sessions中的"; secure"cookie标志.此标志阻止浏览器通过未加密的http连接发送cookie,基本上使得https用于合法请求毫无意义.

private void rewriteCookieToHeader(HttpServletRequest request, HttpServletResponse response) {
    if (response.containsHeader("SET-COOKIE")) {
        String sessionid = request.getSession().getId();
        String contextPath = request.getContextPath();
        String secure = "";
        if (request.isSecure()) {
            secure = "; Secure"; 
        }
        response.setHeader("SET-COOKIE", "JSESSIONID=" + sessionid
                         + "; Path=" + contextPath + "; HttpOnly" + secure);
    }
}


请注意,使用`request.isSecure()`并不总是准确的.考虑LB后面的负载平衡节点,执行SSL加速.从浏览器到负载均衡器的请求将通过HTTPS进行,而负载均衡器和实际服务器之间的请求将通过纯HTTP进行.这将导致`request.isSecure()`为`false`,而浏览器正在使用SSL.

4> Shabaz..:

对于会话cookie,它似乎在Tomcat中不受支持.查看错误报告需要添加对HTTPOnly会话cookie参数的支持.现在可以在这里找到一个有点涉及的解决方法,这基本上归结为手动修补Tomcat.在这一刻,我真的找不到一个简单的方法来做这件事我很害怕.

总结一下解决方法,它涉及下载5.5 源代码,然后在以下位置更改源代码:

org.apache.catalina.connector.Request.java

//this is what needs to be changed
//response.addCookieInternal(cookie);

//this is whats new
response.addCookieInternal(cookie, true);
}

org.apache.catalina.connectorResponse.addCookieInternal

public void addCookieInternal(final Cookie cookie) {
addCookieInternal(cookie, false);
}

public void addCookieInternal(final Cookie cookie, boolean HTTPOnly) {

if (isCommitted())
return;

final StringBuffer sb = new StringBuffer();
//web application code can receive a IllegalArgumentException
//from the appendCookieValue invokation
if (SecurityUtil.isPackageProtectionEnabled()) {
AccessController.doPrivileged(new PrivilegedAction() {
public Object run(){
ServerCookie.appendCookieValue
(sb, cookie.getVersion(), cookie.getName(),
cookie.getValue(), cookie.getPath(),
cookie.getDomain(), cookie.getComment(),
cookie.getMaxAge(), cookie.getSecure());
return null;
}
});
} else {
ServerCookie.appendCookieValue
(sb, cookie.getVersion(), cookie.getName(), cookie.getValue(),
cookie.getPath(), cookie.getDomain(), cookie.getComment(),
cookie.getMaxAge(), cookie.getSecure());
}
//of course, we really need to modify ServerCookie
//but this is the general idea
if (HTTPOnly) {
sb.append("; HttpOnly");
}

//if we reached here, no exception, cookie is valid
// the header name is Set-Cookie for both "old" and v.1 ( RFC2109 )
// RFC2965 is not supported by browsers and the Servlet spec
// asks for 2109.
addHeader("Set-Cookie", sb.toString());

cookies.add(cookie);
}



5> Alireza Fatt..:

如果您的Web服务器支持Serlvet 3.0规范,例如tomcat 7.0+,您可以在下面使用web.xml:


  
     true        
     true        
  

如文档中所述:

HttpOnly:指定此Web应用程序创建的任何会话跟踪cookie是否将标记为HttpOnly

安全:指定是否将此Web应用程序创建的任何会话跟踪cookie标记为安全,即使发起相应会话的请求使用的是纯HTTP而不是HTTPS

请参考如何为java Web应用程序设置httponly和会话cookie

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有