SpringSecurityを使用してCSRF攻撃を処理


CSRF脆弱性の現状CSRF(Cross-site request forgery)は、駅をまたいで偽造を要求し、One Click AttackまたはSession Ridingとも呼ばれ、通常はCSRFまたはXSRFと略され、ウェブサイトへの悪意のある利用である.クロスステーションスクリプト(XSS)のように聞こえますが、XSSとは異なり、XSSはサイト内の信頼されたユーザを利用し、CSRFは信頼されたユーザの要求を偽装することによって信頼されたウェブサイトを利用します.XSS攻撃に比べてCSRF攻撃はあまり流行しないことが多く(そのため、それを防ぐ資源もかなり少ない)、防ぎにくいため、XSSよりも危険性があると考えられている.CSRFは、ウェブブラウザに依存し、混同されたエージェント攻撃である(deputy attack).
POM依存


  org.springframework.boot
  spring-boot-starter-freemarker



  org.springframework.security
  spring-security-web
フィルタの設定
@SpringBootApplication
public class Application {

  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }
  
  /**
   *   CSRF   
   *
   * @return {@link org.springframework.boot.web.servlet.FilterRegistrationBean}
   */
  @Bean
  public FilterRegistrationBean csrfFilter() {
    FilterRegistrationBean registration = new FilterRegistrationBean<>();
    registration.setFilter(new CsrfFilter(new HttpSessionCsrfTokenRepository()));
    registration.addUrlPatterns("/*");
    registration.setName("csrfFilter");
    return registration;
  }
}
formリクエストにCSRFの非表示フィールドを追加
AJAXリクエストにヘッダーを追加
xhr.setRequestHeader("${_csrf.headerName}", "${_csrf.token}");
jQueryのAjaxグローバル構成
jQuery.ajaxSetup({
  "beforeSend": function (request) {
    request.setRequestHeader("${_csrf.headerName}", "${_csrf.token}");
  }
});