SpringSecurityを使用してCSRF攻撃を処理
2034 ワード
CSRF脆弱性の現状
POM依存
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}");
}
});