1. ホーム
  2. http

[解決済み] JSON Web サービスは CSRF 攻撃を受けやすいですか?

2023-04-05 12:59:13

質問

私は、リクエストとレスポンスのコンテンツに JSON を使用する Web サービスを構築しています (つまり、フォームでエンコードされたペイロードはありません)。

次のことが当てはまる場合、Web サービスは CSRF 攻撃に対して脆弱ですか?

  1. 任意の POST リクエストで、トップレベルの JSON オブジェクトを持たないもの、例えば {"foo":"bar"} のようなトップレベルの JSON オブジェクトがない場合、400 で拒否されます。例えば POST という内容のリクエストは 42 はこのように拒否されます。

  2. 任意の POST 以外のコンテントタイプを持つリクエストは application/json を含むリクエストは 400 で拒否されます。例えば POST リクエストで、content-type が application/x-www-form-urlencoded のリクエストは拒否されます。

  3. すべての GET リクエストは セーフ であり、サーバ側のデータを変更することはありません。

  4. クライアントはセッションクッキーによって認証されます。このクッキーは、クライアントが正しいユーザー名とパスワードのペアをJSONデータでPOSTした後に、ウェブサービスがクライアントに渡します(例. {"username":"[email protected]", "password":"my password"} .

付随的な質問です。このような場合 PUTDELETE リクエストはCSRFに対して脆弱なのでしょうか?私が尋ねるのは、ほとんどの(すべての?)ブラウザがHTMLフォームでこれらのメソッドを許可しないように思われるからです。

EDIT: 4番目の項目を追加しました。

編集: これまでに多くの良いコメントと回答がありましたが、この Web サービスが脆弱である特定の CSRF 攻撃を提供する人はいませんでした。

どのように解決するのですか?

任意のメディアタイプで任意の CSRF リクエストを偽造することは、事実上 XHR でのみ可能です。 フォームのメソッドが GET と POST に限定されているためです。 であり フォームの POST メッセージのボディもまた、次の三つの形式に限られます。 application/x-www-form-urlencoded , multipart/form-data そして text/plain . しかし には、フォームデータのエンコーディングが text/plain である場合、有効な JSON データを含むリクエストを偽造することは可能です。 .

したがって、唯一の脅威は XHR ベースの CSRF 攻撃から来るものです。そしてそれらは同じ起源からのものである場合にのみ成功します。つまり、基本的には何らかの形で自分のサイトからのものです (例: XSS)。CORSを無効にする(つまりAccess-Control-Allow-Origin: *を設定しない)ことを保護と勘違いしないように注意してください。CORSは、単にクライアントが応答を読むのを防ぐだけです。リクエスト全体は依然としてサーバーによって送信および処理されます。