【问题标题】:Spring MVC OPTIONSSpring MVC 选项
【发布时间】:2016-01-28 13:24:00
【问题描述】:

我有一个带有 SpringSecurity 项目的 spring-boot 1.3.0-BUILD-SNAPSHOT,我担心 REST 端点的安全性。我定义了一个 CORS 过滤器:

@Configuration
public class CorsConfiguration {

    @Bean
    public WebMvcConfigurer corsConfigurer() {

        return new WebMvcConfigurerAdapter() {

            @Override
            public void addCorsMappings(CorsRegistry registry) {

                registry.addMapping( "/**" ).allowedOrigins( "*" )
                        .allowedHeaders( "Access-Control-Allow-Origin", "*"          )       "x-requested-with" )
                        .allowedHeaders("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE")
                        .allowedMethods("GET", "POST", "PUT", "DELETE")
                        .allowedMethods("Access-Control-Allow-Headers", "Content-Type")
                        .maxAge( 3600);

            }

        };
    }
}

我有一个 REST 控制器:

@Controller
@Transactional
public class Controller extends BaseController {

    @Autowired
    private QuestionService questionService;

    @RequestMapping(value = "/questions", method = RequestMethod.GET)
    @ResponseBody
    public List<Question> getAllQuestions() {
        return questionService.getAllAvailableQuestions();
    }

  ...
}

但是,当我使用 OPTIONS 调用访问某个端点时,我得到的结果似乎不仅仅允许该端点定义的 GET:

Allow → GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, PATCH
Cache-Control → no-cache, no-store, max-age=0, must-revalidate
Content-Length → 0
Date → Wed, 28 Oct 2015 16:32:12 GMT
Expires → 0
Pragma → no-cache
Server → Apache-Coyote/1.1
X-CSRF-HEADER → X-CSRF-TOKEN
X-CSRF-PARAM → _csrf
X-CSRF-TOKEN → 83983056-f904-449e-a215-fe9f9492866b
X-Content-Type-Options → nosniff
X-Frame-Options → DENY
X-XSS-Protection → 1; mode=block

我认为 Spring MVC 默认会忽略 OPTIONS 调用。但我想我也不明白为什么当我只允许 GET 进行该调用时,我看到 Allow → GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, PATCH 被返回。在整个应用程序中,我只允许 GET、PUT、POST、DELETE,所以我不知道为什么会返回其他值,以及这意味着什么。最重要的是,这是一个安全漏洞吗?

【问题讨论】:

  • 到目前为止,您的问题中没有关于 Spring Security 的内容。你的电话是什么样的?为什么 Spring 默认忽略 OPTIONS 以及它应该如何与需要 OPTIONS 的 CORS 一起使用?是什么让您收到安全问题的响应?您是在哪里以及如何定义只允许 GET、PUT、POST、DELETE 的? addCorsMappings 仅与 CORS 有关,仅此而已。
  • 是的,在通过安全审查后,我仍在了解这一切意味着什么。我提到 Spring Security 是因为项目包含它,并且我认为它可能与这个主题相关。我做了一些研究并读到 OPTIONS 在默认情况下被忽略,但也许这是一个错误的链接。在我的 CORS 配置中,我只允许这 4 种方法,这就是为什么我不明白为什么在 CORS 和我自己的 REST 时允许 OPTIONS 说“GET、HEAD、POST、PUT、DELETE、TRACE、OPTIONS、PATCH”端点不会全部使用它们。
  • CORS 仅与浏览器相关(即 AJAX!)并且与 CORS 相关的响应标头都以 Access-Control- 开头。控制器只能处理对/questionsGET 请求。因此,如果您没有针对该 URL 的任何其他处理程序,则会为每个其他请求方法返回错误。对于每个请求都是如此:没有适当的处理程序 -> 状态 4xx。
  • 谢谢你,这有助于我更好地理解。

标签: spring-mvc spring-security cors http-options-method


【解决方案1】:

对于 Spring Boot 应用程序,将以下属性添加到 application.properties 文件中:

spring.mvc.dispatch-options-request=true

它会完成这项工作。

【讨论】:

    【解决方案2】:

    如果您查看BaseFrameworkServlet#setDispatchOptionsRequest() 的 JavaDoc,它包含以下注释:

    设置此servlet 是否应将HTTP OPTIONS 请求分派给#doService 方法 默认为“false”,应用javax.servlet.http.HttpServlet 的默认行为(即枚举所有标准HTTP 请求方法作为对OPTIONS 请求的响应)。


    但我想我也不明白为什么当我只允许 GET 进行该调用时,我看到 Allow → GET、HEAD、POST、PUT、DELETE、TRACE、OPTIONS、PATCH 被返回。

    正如上面评论中提到的,请求不是由 Spring MVC 调度程序处理的,而是由HttpServletRequest#doOptions 处理的,它枚举了 服务器支持的 HTTP 方法,并且对你的控制器映射一无所知。 p>

    如果您想验证这种行为,您可以在DispatcherServletdoService 方法和HttpServlets doOptions 方法中放置断点,然后查看调用了哪一个。如果您希望 OPTIONS 请求由调度程序处理,您可以使用here 描述的方式之一启用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-26
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      相关资源
      最近更新 更多