关于安全性:如何为Java Web应用程序设置httponly和会话cookie

how to set httponly and session cookie for java web application

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

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

1
2
3
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 ..猜测它设置为null。

请分享任何想法。

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


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

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

1
2
3
4
5
6
<session-config>
  <cookie-config>
    <secure>true</secure>
    <http-only>true</http-only>
  </cookie-config>
</session-config>

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

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


您需要使用以下语法来设置httponly和Secure标志

1
JSESSIONID=ABC3423DF...SDF;HttpOnly;Secure

我在web.xml中使用了标记来设置安全属性,并且它起作用了。

1
2
3
4
5
<session-config>
 <cookie-config>
  <http-only>true</http-only>
 </cookie-config>
<session-config>