
本文旨在解决 Checkmarx 扫描报告中关于 Spring 应用跨域资源共享 (CORS) 策略过于宽松的问题。通过分析 @CrossOrigin 注解的使用方式,解释了为何通配符配置会导致安全风险,并提供了如何通过配置白名单来限制允许访问资源的域的示例代码和注意事项,帮助开发者提升应用的安全性。
跨域资源共享 (CORS) 简介
同源策略是浏览器的一项安全机制,它限制了来自不同源的文档或脚本对当前文档或脚本的资源进行访问。这里的“源”由协议、域名和端口组成。 CORS 是一种机制,它使用额外的 HTTP 头部来告诉浏览器,允许运行在一个 origin (域) 上的 Web 应用访问来自不同 origin 服务器上的指定资源。
Checkmarx 报告的问题:过于宽松的 CORS 策略
Checkmarx 扫描器报告 "The method ... sets an overly permissive CORS access control origin header" 通常意味着你的 Spring 应用的 CORS 配置允许来自任何域的请求,这会带来潜在的安全风险。
例如,以下配置就存在风险:
@CrossOrigin(origins = "*", allowedHeaders = "*", methods = {RequestMethod.GET, RequestMethod.OPTIONS, RequestMethod.POST, RequestMethod.PUT, RequestMethod.DELETE})上述代码中的 origins = "*" 允许来自任何域的请求访问你的 API。 虽然这在某些开发或测试场景下可能很方便,但在生产环境中,这会使你的应用容易受到跨站请求伪造 (CSRF) 等攻击。
解决方案:使用白名单限制允许的域
解决此问题的关键在于使用白名单,明确指定允许访问你的 API 的域。 这意味着你需要将 origins 属性的值设置为一个或多个具体的域名,而不是通配符 *。
以下是一个示例:
@CrossOrigin(origins = "https://yourdomain.com", allowedHeaders = "Accept,Accept-Language,Content-Language,Content-Type", methods = {RequestMethod.GET, RequestMethod.OPTIONS, RequestMethod.POST, RequestMethod.PUT, RequestMethod.DELETE})在这个例子中,只有来自 https://yourdomain.com 的请求才会被允许访问该方法。 allowedHeaders 属性也应该根据实际需要进行限制,避免允许所有 Header。
如何查找并修改 CORS 配置
- 查找 @CrossOrigin 注解: 在你的 Spring 应用中搜索 @CrossOrigin 注解。 这些注解可能位于 Controller 类、方法级别,或者全局配置类中。
- 检查 origins 属性: 确认 origins 属性的值是否为 "*"。 如果是,则需要修改它。
- 修改 origins 属性: 将 origins 属性的值替换为你允许访问你的 API 的具体域名列表。 例如:origins = {"https://yourdomain.com", "https://anotherdomain.com"}。
- 限制 allowedHeaders: 同样,根据实际需求,限制允许的 Headers,避免使用 "*"。
- 测试: 修改配置后,务必进行测试,确保只有来自白名单域的请求才能成功访问你的 API。
全局 CORS 配置
除了在 Controller 或方法级别使用 @CrossOrigin 注解外,你还可以使用 Spring MVC 的配置类进行全局 CORS 配置。
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") // 拦截所有请求
.allowedOrigins("https://yourdomain.com") // 允许跨域的域名,多个可以用逗号隔开
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") // 允许跨域的方法
.allowedHeaders("*") // 允许跨域的请求头
.allowCredentials(true) // 是否允许发送cookie
.maxAge(3600); // 预检请求的有效期,单位秒。
}
}这种方式可以集中管理 CORS 策略,更易于维护。 同样,需要注意 allowedOrigins 和 allowedHeaders 的配置,避免过于宽松。
注意事项
- 生产环境: 在生产环境中,务必使用白名单来限制允许访问你的 API 的域。
- HTTPS: 建议使用 HTTPS 协议,以确保数据传输的安全性。
- 测试: 在修改 CORS 配置后,务必进行测试,确保只有来自白名单域的请求才能成功访问你的 API。
- 文档: 清晰地记录你的 CORS 策略,以便其他开发人员了解如何正确地使用你的 API。
总结
通过限制 CORS 策略,你可以有效地提高你的 Spring 应用的安全性,防止潜在的跨站攻击。 记住,在生产环境中,始终使用白名单来明确指定允许访问你的 API 的域。 此外,定期审查和更新你的 CORS 配置,以确保其仍然满足你的安全需求。









