如何为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的应用程序中注入了许多与安全性相关的响应标头。