【问题标题】:Tomcat 7: Sonar compliant setHttpOnly(true) for CookieTomcat 7:Cookie 的声纳兼容 setHttpOnly(true)
【发布时间】:2020-04-09 08:01:03
【问题描述】:

下面是我从 Tomcat 7 API 创建 javax.servlet.http.Cookie 的 Java 代码

 Cookie c = new Cookie("code", code.trim());
 c.setPath("/public");
 response.addCookie(c);
 response.setStatus(200);

我正在尝试添加 c.setHttpOnly(true); 以使上述代码声纳兼容,但 Eclipse 抛出编译器错误说 he method setHttpOnly(boolean) is undefined for the type Cookie,但从 Tomcat 7 API https://tomcat.apache.org/tomcat-7.0-doc/servletapi/index.html 的 Javadoc 我确实看到 setHttpOnly() 存在于 @ 987654327@ class,有人可以帮我理解为什么添加c.setHttpOnly(true);会出现编译器错误吗?

【问题讨论】:

  • 您可能有 Servlet API 的冲突版本。你能检查一下你没有使用没有这个方法的2.5版本吗?
  • 您使用 Maven、Gradle 还是其他构建工具?
  • @Evgeniy 我使用 Maven

标签: java tomcat servlets sonarqube


【解决方案1】:

Servlet 3.0 规范中增加了javax.servlet.http.Cookie 类的方法setHttpOnly

Tomcat 7 实现了 Servlet 3.0 规范,但为了编译您的代码,您需要添加适当的 Maven 依赖项。

确保您依赖于 Servlet 3.0 API,范围为 provided

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.0.1</version>
    <scope>provided</scope>
</dependency>

有了这个依赖代码cookie.setHttpOnly(true);就会编译。

手动将 HttpOnly 标志附加到 cookie 值 response.addHeader("Set-Cookie","name=value; HttpOnly"); 很可能不会通过 SonarQube 检查。

规则https://rules.sonarsource.com/java/RSPEC-3330 检查是否存在setHttpOnly(true) 方法调用。

但是可以通过在导致警告的行尾添加 //NOSONAR 注释来抑制此 SonarQube 检查:

Cookie c = new Cookie("code", code.trim()); //NOSONAR

【讨论】:

    【解决方案2】:

    你可能还在使用Servlet API 2.5

    web.xml 指定版本

    <web-app xmlns="http://java.sun.com/xml/ns/javaee"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
              http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
              version="2.5">
    

    如果您使用Servlet 2.5,请参阅@dpinya 答案以设置 HttpOnly:

    对于 Servlet API 2.5,您可以使用

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

    另请参阅使用 context.xml 设置 HTTPOnly 的选项:

    Tomcat 7 中的会话和 SSO cookie 默认使用 HttpOnly 标志发送,以指示浏览器阻止 JavaScript 访问这些 cookie。这被认为更安全,但它会阻止 JavaScript 访问 cookie 的值。此功能可以通过 Context 元素上的 useHttpOnly 属性来控制。 (此功能也在最新版本的 Tomcat 6.0 中实现,但默认关闭。可以通过在 Web 应用程序的 Context 元素或全局 CATALINA_BASE/conf/context.xml 文件中设置 useHttpOnly="true" 来启用它)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-18
      • 1970-01-01
      • 2015-11-07
      • 2012-02-26
      • 1970-01-01
      • 2017-09-17
      • 1970-01-01
      相关资源
      最近更新 更多