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