是否有必要针对CSRF保护JAX-RS请求?
按definition REST是无状态的,因此不存在会话ID(会话cookie),因为根本没有会话(另请参阅https://stackoverflow.com/a/15746639/5277820)。
我的Spring Security 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攻击吗?
答案 0 :(得分:2)
CSRF攻击不需要存在会话。 CSRF攻击包括通过欺骗他/她单击链接或提交转到用户登录的应用程序的表单来代表用户执行某些操作。
是否使用基本身份验证或会话cookie来识别用户是无关紧要的。
请注意,使用Cookie并不意味着该应用不是无状态的。与基本身份验证一样,Cookie只是在为每个HTTP请求发送一个额外的标头。
答案 1 :(得分:0)
访问令牌有时存储在(最安全的http-only)cookie中,因此客户端无需在每个请求中手动添加手动:cookie会自动附加到请求中由浏览器。这就是为什么需要实施CSRF保护的原因。
您链接的文章建议让客户端生成并在Cookie和自定义HTTP标头中发送相同的唯一秘密值,这非常聪明:
考虑到网站只允许读取/写入Cookie 拥有自己的域,只有真实站点可以在两者中发送相同的值 头。
也就是说,如果您收到的电子邮件中包含定位http://yourserver.com/admin/deleteAll
的假图片(并且服务器通过GET
处理...),那么唯一秘密将不会在请求标头中设置(旧的可能仍然存在于cookie中):服务器必须拒绝该请求。