2015-10-19 70 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