スプリングセキュリティ CSRF対策
2022-02-20 21:30:34
CSRFとは、Web上でよく見られる攻撃の1つであるCSRF(Cross-site request forgery)のこと。
Spring Security 4.0から、アプリケーションへのCSRF攻撃を防ぐためにCSRF保護機能がデフォルトで有効になり、PATCH、POST、PUT、DELETEメソッドに対してSpring Security CSRFが保護されるようになりました。
私の側はspring bootのプロジェクトで、@EnableWebSecurityアノテーションを有効にすると自動的に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}" />
<! -- The default title name is 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', //returned data format: json/xml/html/script/jsonp/text
beforeSend: function(xhr) {
xhr.setRequestHeader(header, token); //Set the csrfToken to the request header before sending the request
},
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(); //unprotect csrf
}
}
関連
-
Java のエラーです。未解決のコンパイル問題 解決方法
-
javaの実行中に「javaの例外が発生しました」と表示された場合はどうすればよいですか?
-
eclipse アクセス制限です。タイプ 'xxx' は API ではありません(必須ライブラリ '' の制限)。
-
Android Studio 3.1.2 で v4, v7 パッケージが見つからない シンボル 'AppCompatActivity' を解決できない
-
マスキング このリソースにアクセスするには、完全な認証が必要です。
-
linux run jarfile Invalid or corrupt jarfile error.
-
org.glassfish.jersey.servlet.ServletContainer
-
SocketTimeoutExceptionです。読み込みがタイムアウトしました
-
Android TextViewの行間解析
-
Tomcat 8は、「少なくとも1つのJARがTLDをスキャンされたが、TLDが含まれていない」問題を解決します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Java Exceptionが発生しました エラー解決
-
jd-gui Java Exceptionが発生しました。
-
コンストラクタの呼び出しは、コンストラクタのエラー理解の最初のステートメントである必要があります。
-
JavaMailのメール送信が失敗するケースとその説明の分析
-
JQuery DataTable 详解
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException: 1
-
[オリジナル】java学習ノート【II】よくあるエラー クラスパス上のクラスファイルが見つからない、またはアクセスできない場合
-
response.sendRedirectによる不具合とその対処法
-
無効なカラム名、エラーは完全に解決
-
VectorのJavaコレクションを徹底解析