是否有必要保护 JAX-RS 请求免受 CSRF 攻击?
Is it necessary to protect JAX-RS requests against CSRF?
是否有必要针对 CSRF 保护 JAX-RS 请求?
通过 definition REST is stateless and therefore exists no session id (session cookie), because there is no session at all (see also )。
我的Spring安全Java配置:
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Configuration
@Order(1)
public static class JaxRsWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {
@Override
protected void configure(final HttpSecurity http) throws Exception {
http
.antMatcher("/services/**")
.csrf().disable()
.authorizeRequests()
.antMatchers(HttpMethod.OPTIONS, "/services/**").permitAll()
.anyRequest().hasAuthority("ROLE_user")
.and()
.httpBasic()
.and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
}
}
}
但我发现例如以下博客:Stateless Spring Security Part 1: Stateless CSRF protection。不幸的是,博客没有解释为什么需要 CSRF 保护。
是否还有其他没有会话 cookie 的 CSRF 攻击?
访问令牌有时存储在(安全的 http-only 充其量)cookie 中,因此客户端不必费心在每个请求中添加它 手动 :浏览器会自动将 cookie 附加到请求中。这就是为什么需要实施 CSRF 保护的原因。
您链接的文章建议让客户端在 Cookie 和自定义 HTTP header 中生成并发送相同的唯一秘密值,这非常聪明:
Considering a website is only allowed to read/write a Cookie for its
own domain, only the real site can send the same value in both
headers.
也就是说,如果您收到一封电子邮件,其中包含以 http://yourserver.com/admin/deleteAll
为目标的虚假图像(并且服务器通过 GET
... 处理它), 唯一秘密 不会在请求中设置 header(cookie 中仍可能存在旧的):服务器必须拒绝请求。
CSRF 攻击不需要 session 存在。 CSRF 攻击包括通过欺骗 him/her 单击 link 或提交表单到用户登录的应用程序来代表用户做某事。
使用基本身份验证还是 session cookie 来识别用户是无关紧要的。
请注意,使用 cookie 并不意味着应用程序不是无状态的。 cookie,就像基本身份验证一样,只是包含在每个 HTTP 请求中发送一个额外的 header。
是否有必要针对 CSRF 保护 JAX-RS 请求?
通过 definition REST is stateless and therefore exists no session id (session cookie), because there is no session at all (see also )。
我的Spring安全Java配置:
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Configuration
@Order(1)
public static class JaxRsWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {
@Override
protected void configure(final HttpSecurity http) throws Exception {
http
.antMatcher("/services/**")
.csrf().disable()
.authorizeRequests()
.antMatchers(HttpMethod.OPTIONS, "/services/**").permitAll()
.anyRequest().hasAuthority("ROLE_user")
.and()
.httpBasic()
.and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
}
}
}
但我发现例如以下博客:Stateless Spring Security Part 1: Stateless CSRF protection。不幸的是,博客没有解释为什么需要 CSRF 保护。
是否还有其他没有会话 cookie 的 CSRF 攻击?
访问令牌有时存储在(安全的 http-only 充其量)cookie 中,因此客户端不必费心在每个请求中添加它 手动 :浏览器会自动将 cookie 附加到请求中。这就是为什么需要实施 CSRF 保护的原因。
您链接的文章建议让客户端在 Cookie 和自定义 HTTP header 中生成并发送相同的唯一秘密值,这非常聪明:
Considering a website is only allowed to read/write a Cookie for its own domain, only the real site can send the same value in both headers.
也就是说,如果您收到一封电子邮件,其中包含以 http://yourserver.com/admin/deleteAll
为目标的虚假图像(并且服务器通过 GET
... 处理它), 唯一秘密 不会在请求中设置 header(cookie 中仍可能存在旧的):服务器必须拒绝请求。
CSRF 攻击不需要 session 存在。 CSRF 攻击包括通过欺骗 him/her 单击 link 或提交表单到用户登录的应用程序来代表用户做某事。
使用基本身份验证还是 session cookie 来识别用户是无关紧要的。
请注意,使用 cookie 并不意味着应用程序不是无状态的。 cookie,就像基本身份验证一样,只是包含在每个 HTTP 请求中发送一个额外的 header。