【发布时间】: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-开头。控制器只能处理对/questions的GET请求。因此,如果您没有针对该 URL 的任何其他处理程序,则会为每个其他请求方法返回错误。对于每个请求都是如此:没有适当的处理程序 -> 状态 4xx。 -
谢谢你,这有助于我更好地理解。
标签: spring-mvc spring-security cors http-options-method