【问题标题】:Turn off HttpOnly Spring boot关闭 HttpOnly Spring 启动
【发布时间】:2014-04-21 02:46:36
【问题描述】:

我想关闭我认为是 Spring Boot 默认的 HttpOnly 会话。 如何在 Spring Boot 上关闭 HttpOnly?

我目前有如下代码:

@RequestMapping(value = "/stuff", method = GET)
public @ResponseBody
myObject doStuff(HttpSession session)
{
        session.setAttribute("foo", "bar");
        return  new MyObject();
}

这会在 HTTP 调用上返回一个响应标头:

Set-Cookie: JSESSIONID=D14846D9767B6404F1FB4B013AB66FB3; Path=/; HttpOnly 

注意 HttpOnly 标志。我想把它关掉。我该怎么做?

旁注:是的,我知道 httpOnly 是一项安全功能,关闭它可以让 javascript 访问我的 cookie,即 XSS。

另外,我没有除默认以外的任何配置。

@ComponentScan
@EnableAutoConfiguration
public class WebApplication {

    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(WebApplication.class);
        app.run(args);
    }
}

【问题讨论】:

  • 什么 Servlet 容器?
  • @SotiriosDelimanolis 我不明白你在问什么。
  • 你在 Spring boot 中使用的是什么嵌入式 Servlet 容器?雄猫?
  • 答案取决于您使用的 Servlet 容器。请了解。
  • @SotiriosDelimanolis Spring boot 声称默认是 Tomcat 7,我没有改变任何东西,所以它将是 tomcat 7

标签: java spring spring-boot httponly


【解决方案1】:

Tomcat 有一个 context attribute named useHttpOnly 用于检查:

是否应该在会话 cookie 上设置 HttpOnly 标志以阻止客户端 访问会话 ID 的脚本?默认为真。

所以你需要将它设置为 false。链接的配置适用于非嵌入式 Tomcat 服务器。我们需要找到一种方法来使用嵌入式 Tomcat。

这就是你的做法。您声明了一个 @Bean 方法,用于将 EmbeddedServletContainerFactory 添加到上下文中。您可以通过指定配置适当属性的TomcatContextCustomizer 来配置返回的TomcatEmbeddedServletContainerFactory。

@Bean
public EmbeddedServletContainerFactory servletContainer() {
    TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
    factory.setTomcatContextCustomizers(Arrays.asList(new CustomCustomizer()));
    return factory;
}

static class CustomCustomizer implements TomcatContextCustomizer {
    @Override
    public void customize(Context context) {
        context.setUseHttpOnly(false);
    }
}

此解决方案有效,因为您使用的是 Tomcat。使用不同的 Servlet 容器,解决方案会有所不同。

【讨论】:

    【解决方案2】:

    另一个适合 Spring Boot 的已接受答案的替代方法是覆盖您的 EmbeddedServletContainerCustomizer 的自定义方法。

    首先,实现接口:

    @Configuration
    @ComponentScan
    @EnableAutoConfiguration
    public class Application implements EmbeddedServletContainerCustomizer
    

    然后为自定义方法添加一个覆盖:

    @Override
    public void customize(final ConfigurableEmbeddedServletContainer container)
    {
        ((TomcatEmbeddedServletContainerFactory) container).addContextCustomizers(new TomcatContextCustomizer()
        {
            @Override
            public void customize(Context context)
            {
                context.setUseHttpOnly(false);
            }
        });
    }
    

    顺便说一句,我发现根本没有为我设置 httpOnly .. 所以我不得不使用这个方法来打开 httpOnly(显然我上面的设置是'true')。

    你也可以使用这个方法来调整tomcat中的其他东西,比如打开gzip for json和扩展最大http headersize(在kerberos认证的情况下我需要这样做):

    ((TomcatEmbeddedServletContainerFactory) container).addConnectorCustomizers(new TomcatConnectorCustomizer()
    {
        @Override
        public void customize(final Connector connector)
        {
            AbstractHttp11Protocol httpProtocol = (AbstractHttp11Protocol) connector.getProtocolHandler();
            httpProtocol.setMaxHttpHeaderSize(65536);
            httpProtocol.setCompression("on");
            httpProtocol.setCompressionMinSize(256);
            String mimeTypes = httpProtocol.getCompressableMimeTypes();
            String mimeTypesWithJson = mimeTypes + "," + MediaType.APPLICATION_JSON_VALUE;
            httpProtocol.setCompressableMimeTypes(mimeTypesWithJson);
        }
    });
    

    【讨论】:

    • 您实际上在一个答案中回答了我的两个问题,而您甚至不知道我的另一个问题是什么。荣誉
    • 需要为会话 cookie 设置“安全”标志。connector.setSecure(true); 为我工作
    • 仅供参考,在当前版本的 Spring Boot (v1.3+) 中,可以使用属性文件来完成上述很多工作。 compression 和 full set of properties you can set
    • @JimB - 是的,有 http-only 的属性,但将其设置为“false”或留空不会删除 HttpOnly 标志。可能有什么东西压倒了它。但是您的解决方案有效,谢谢!
    【解决方案3】:

    至少在 Spring Boot >= 1.4 上,它更容易,只需使用以下属性:

    server.servlet.session.cookie.http-only= # "HttpOnly" flag for the session cookie. configuration property.
    

    如 official documentation 中所述。

    【讨论】:

      【解决方案4】:
      server.servlet.session.cookie.http-only=false 
      

      (属性已更新)

      参考https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

      【讨论】:

      • 感谢您的信息。我刚刚在我的 Spring Boot 应用程序上尝试了这个,但它不起作用? JESSIONID 仍然使用 HttpOnly 设置。我想知道您是否对如何调试或解决方法有任何想法?
      猜你喜欢
      • 2017-02-04
      • 1970-01-01
      • 2018-07-16
      • 2020-06-27
      • 1970-01-01
      • 2017-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多