spring security CSRF保護の例コード


CSRFとは、クロスステーション要求偽造(Cross-site request forgery)を指し、ウェブでよく見られる攻撃の一つです。
Spring Security 4.0からは、デフォルトではCSRF保護が有効となり、CSRF攻撃アプリケーションを防止するため、Spring Security CSRFはPATCH、POST、PUT、DELETE方法に対して防護を行う。
こちらはスプリングブックのプロジェクトです。@EnbleWebSecurity注釈を有効にしたら、csrf保護は自動的に有効になります。
したがって、デフォルトの設定では、ログインしても、ページでPATCH、POST、PUT、DELETE要求が拒否され、403に戻り、要求インターフェースにcsrfTokenを追加する必要があります。
freemarkerなどのテンプレートエンジンやjspを使ってフォームに提出すると、以下の隠し領域がフォームに追加されます。

<input type = “hidden” name = “${_csrf.parameterName}” value = “${_csrf.token}” /> 
JSONを使用すると、HTTPパラメータにCSRFトークンを提出できません。逆に、HTTPヘッダにトークンを送信することができます。典型的なモードは、CSRFトークンをメタタグに含めることである。以下はJSPの例を示している。

<html> 
<head> 
  <meta name = “_csrf” content = “${_csrf.token}” /> 
  <!--        X-CSRF-TOKEN --> 
  <meta name = “_csrf_header” content = “${_csrf.headerName}” /> 
</ head> 
その後、すべてのAjax要求にトークンを含めることができる。jQueryを使うと、以下の方法でこの操作を完了できます。

var token = $("meta[name='_csrf']").attr("content");
var header = $("meta[name='_csrf_header']").attr("content");
$.ajax({
  url:url,
  type:'POST',
  async:false,
  dataType:'json',  //       :json/xml/html/script/jsonp/text
  beforeSend: function(xhr) {
    xhr.setRequestHeader(header, token); //      csrfToken       
  },
  success:function(data,textStatus,jqXHR){
  }
});
CSRF保護を有効にしたくないなら、spring security構成でcsrfをキャンセルできます。

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
        .antMatchers("/login").permitAll()
        .anyRequest().authenticated()
        .and()
        ...
    http.csrf().disable(); //  csrf  
  }
}
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。