如何为Java Web应用程序设置httponly和会话cookie


问题内容

我正在研究XSS(跨站点脚本)问题。我的应用程序在Oracle Weblogic门户上运行。我们使用Servlet 2.5版。

我在过滤器中添加了以下3行代码,用于设置httponly和安全cookie,它工作正常。

String sessionid = req.getSession().getId();
res.setHeader("Set-Cookie", "JSESSIONID=" +  sessionid + ";HttpOnly");
res.setHeader("SET-COOKIE", "JSESSIONID=" + sessionid + "; secure");

问题是当我注销并立即在同一浏览器中登录时。我可以登录,但是在此之后,在jsp页面上我遇到了会话超时问题。我们使用与weblogic相关的API。该request.getuserprinical()API将返回空..估计是设置为NULL。

请分享任何想法。

如果还有其他设置httponly或安全标志的方法,请提供帮助。


问题答案:

根据您的Web容器的具体情况,在应用程序中修改容器管理的会话cookie可能导致应用程序服务器抛弃现有会话并创建一个新会话。我已经在Tomcat上观察到了这一点,但对于Weblogic来说可能相似。

如果您使用的是Servlets 3.0,则实际上可以指示应用服务器确保所有会话cookie都是HttpOnly和Secure,并带有以下片段:

<session-config>
  <cookie-config>
    <secure>true</secure>
    <http-only>true</http-only>
  </cookie-config>
</session-config>

与使用过滤器手动修改Cookie相比,这是一种更好的方法。

仅供参考:我还写了一个Java库,在基于Servlet的应用程序中注入了许多与安全性相关的响应标头。