[解決済み] JSON Web サービスは CSRF 攻撃を受けやすいですか?
質問
私は、リクエストとレスポンスのコンテンツに JSON を使用する Web サービスを構築しています (つまり、フォームでエンコードされたペイロードはありません)。
次のことが当てはまる場合、Web サービスは CSRF 攻撃に対して脆弱ですか?
-
任意の
POST
リクエストで、トップレベルの JSON オブジェクトを持たないもの、例えば{"foo":"bar"}
のようなトップレベルの JSON オブジェクトがない場合、400 で拒否されます。例えばPOST
という内容のリクエストは42
はこのように拒否されます。 -
任意の
POST
以外のコンテントタイプを持つリクエストはapplication/json
を含むリクエストは 400 で拒否されます。例えばPOST
リクエストで、content-type がapplication/x-www-form-urlencoded
のリクエストは拒否されます。 -
すべての GET リクエストは セーフ であり、サーバ側のデータを変更することはありません。
-
クライアントはセッションクッキーによって認証されます。このクッキーは、クライアントが正しいユーザー名とパスワードのペアをJSONデータでPOSTした後に、ウェブサービスがクライアントに渡します(例.
{"username":"[email protected]", "password":"my password"}
.
付随的な質問です。このような場合
PUT
と
DELETE
リクエストは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は、単にクライアントが応答を読むのを防ぐだけです。リクエスト全体は依然としてサーバーによって送信および処理されます。
関連
-
[解決済み] updateとdeleteのHTTPステータスコード?
-
[解決済み] JWT(JSONウェブトークン)の有効期限を自動的に延長する機能
-
[解決済み] URLクエリパラメータを含むHTTP POST -- 良いアイデアかどうか?
-
[解決済み] なぜCSRF防止トークンをクッキーに入れるのが一般的なのですか?
-
[解決済み] bash/shellスクリプトからhttp応答コードを評価する方法は?
-
[解決済み】jQuery Ajaxの呼び出しとHtml.AntiForgeryToken()について)
-
[解決済み】no-cacheとmust-revalidateの違いについて
-
[解決済み] HTTPのPOSTメソッドをキャッシュすることは可能ですか?
-
[解決済み] CORS OriginヘッダーとCSRFトークンによるCSRF保護
-
[解決済み] RESTfulログインの失敗。401またはカスタムレスポンスを返す
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] X-REQUEST-ID httpヘッダーとは何ですか?
-
[解決済み] Preflightとredirectを使用したCORSリクエスト: 不許可になりました。回避策は?
-
[解決済み] ブラウザによって異なるURLの最大長とは?
-
[解決済み] HTTPヘッダーの大文字と小文字は区別されますか?
-
[解決済み] ブラウザのCookieドメインはどのように機能するのですか?
-
[解決済み] サーバーの1つのポート(例えば80)に複数のクライアントが同時に接続するにはどうすればよいですか?[重複しています]。
-
[解決済み] HTTPとRESTの違いは何ですか?
-
[解決済み] application/x-www-form-urlencoded or multipart/form-data?
-
[解決済み】エンティティボディを持たないHTTP POSTを実行することはバッドプラクティスとみなされますか?
-
[解決済み】どのHTTPメソッドがどのCRUDメソッドと一致するか?