Spring Boot REST API - 按客户端类型(浏览器/非浏览器)启用/禁用 CSRF 保护?
Spring Boot REST API - enable / disable CSRF protection by client type (browser / non-browser)?
我有一个 Spring 引导 REST API。由于安全策略,我需要为浏览器访问的端点启用 CSRF 保护。但是,这个 API 也将被非浏览器访问。有没有一种方法可以创建两组端点,一组仅在启用 CSRF 的情况下可由浏览器访问,另一组仅可在禁用 CSRF 的情况下由非浏览器访问?
我认为您可以为浏览器请求和 API 请求分别设置 URL 基础。
例如,您可以在 /api/...
下以及 SpringBootSecurityConfiguration
class 和 configure(HttpSecurity http)
中包含要由 non-browsers 查询的所有端点如果模式匹配,您可以使用 http.csrf().disable();
有条件地禁用 CSRF 的方法(可以找到很棒的教程 here)
编辑:这是另一个可能有用的answer。
当您使用 DSL 配置 CSRF 保护时,像这样 http.csrf()...
您可以通过传递 RequestMatcher
来判断您希望应用 CSRF 保护的请求,如下所示:
http.csrf(csrf -> csrf.requireCsrfProtectionMatcher(new MyBrowserRequestMatcher()));
并且您的 RequestMatcher
实现可以验证 HttpServletRequest
是否包含 header X-Requested-With: XMLHttpRequest
或检查 User-Agent
.
请记住,header 可以更改,您无法保证请求确实来自浏览器或 non-browser 应用程序。
我有一个 Spring 引导 REST API。由于安全策略,我需要为浏览器访问的端点启用 CSRF 保护。但是,这个 API 也将被非浏览器访问。有没有一种方法可以创建两组端点,一组仅在启用 CSRF 的情况下可由浏览器访问,另一组仅可在禁用 CSRF 的情况下由非浏览器访问?
我认为您可以为浏览器请求和 API 请求分别设置 URL 基础。
例如,您可以在 /api/...
下以及 SpringBootSecurityConfiguration
class 和 configure(HttpSecurity http)
中包含要由 non-browsers 查询的所有端点如果模式匹配,您可以使用 http.csrf().disable();
有条件地禁用 CSRF 的方法(可以找到很棒的教程 here)
编辑:这是另一个可能有用的answer。
当您使用 DSL 配置 CSRF 保护时,像这样 http.csrf()...
您可以通过传递 RequestMatcher
来判断您希望应用 CSRF 保护的请求,如下所示:
http.csrf(csrf -> csrf.requireCsrfProtectionMatcher(new MyBrowserRequestMatcher()));
并且您的 RequestMatcher
实现可以验证 HttpServletRequest
是否包含 header X-Requested-With: XMLHttpRequest
或检查 User-Agent
.
请记住,header 可以更改,您无法保证请求确实来自浏览器或 non-browser 应用程序。