Spring MVC OPTIONS

时间:2015-10-28 16:39:11

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

我有一个带有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,所以我不知道为什么返回其他值,这意味着什么。最重要的是,这是一个安全漏洞吗?

2 个答案:

答案 0 :(得分:3)

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

  

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

  

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

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

如果要验证此行为,可以使用DispatcherServlet的{​​{1}}方法和doService s HttpServlet方法放置断点,并查看哪一个被调用。如果您希望调度程序处理OPTIONS请求,您可以使用here所述的方法之一启用它。

答案 1 :(得分:0)

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

spring.mvc.dispatch-options-request=true

它将完成这项工作。