2015-10-19 44 views
5

是否有必要针对CSRF来保护JAX-RS请求?是否有必要保护针对CSRF的JAX-RS请求?

通过definition REST是无状态的,因此不存在会话ID(会话cookie),因为根本没有会话(另请参阅https://stackoverflow.com/a/15746639/5277820)。

我的春季安全的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保护。

有没有其他CSRF攻击没有会话cookie?

+0

如果您的网站被网页浏览器使用,您只需要保护它们免受CSRF攻击。如果它只能用于卷曲,那么您不需要担心CSRF –

回答

2

CSRF攻击不需要存在会话。 CSRF攻击包括通过欺骗他/她点击一个链接或提交一个表单到用户登录的应用程序来代表用户执行某些操作。

是否使用基本身份验证或会话cookie识别用户是不相关的。

请注意,使用cookie并不意味着该应用程序不是无状态的。 Cookie就像基本认证一样,只是在每个HTTP请求中发送一个额外的头部。

+0

谢谢。对于[基本验证方案](https://en.wikipedia.org/wiki/Basic_access_authentication),我在[RFC 2617](https://tools.ietf.org/html/rfc2617#page-5)中找到了相关部分, :“客户端应该假设所有等于或深于Request-URI路径字段中最后一个符号元素 的路径都在当前质询的基本领域值 指定的保护空间内。客户端可以抢先发送 相应的授权标头,并在 的资源请求中获得空间,而不会收到来自服务器的另一个挑战。 – dur

0

访问令牌有时存储在一个(最安全的http-only)cookie中,这样客户端就不必费心在每个请求中添加它手动:Cookie自动附加到浏览器的请求中。这是为什么CSRF保护需要实施的原因。

你链接的文章提出有客户端生成并在这两个cookie和一个自定义HTTP标头,这是相当聪明的发送相同的独特秘密值:

考虑一个网站只允许要为其自己的域名 读取/写入Cookie,只有真实网站可以在两个 标头中发送相同的值。

也就是说,如果你收到一个假的图像定位http://yourserver.com/admin/deleteAll例如电子邮件(和服务器通过GET处理它...),该独门秘诀不会在请求头设置(旧的可能仍然存在于cookie中):服务器必须拒绝该请求。

+0

我知道cookie会自动附加到浏览器的请求中,但我不知道授权标头也会自动附加到浏览器。最后一个确实是无状态(和无Cookie)JAX-RS请求的问题。 – dur