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

2022-09-04 02:13:49

我正在处理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。该 api 返回空值。猜测它设置为空。request.getuserprinical()

请分享任何想法。

如果有任何其他方法可以设置 httponly 或安全标志,请提供帮助。


答案 1

根据 Web 容器的具体情况,修改应用内容器托管的会话 Cookie 可能会导致应用服务器抛弃现有会话并创建新会话。我在Tomcat上观察到了这一点,但对于Weblogic来说可能类似。

如果您使用的是 Servlets 3.0,您实际上可以指示应用程序服务器确保所有会话 Cookie 都是 HttpOnly 和安全的,并使用以下片段:

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

这是一种比使用过滤器手动破解cookie更好的方法。

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


答案 2

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

JSESSIONID=ABC3423DF...SDF;HttpOnly;Secure