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を使ってフォームに提出すると、以下の隠し領域がフォームに追加されます。
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
}
}
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。