要求と応答のコンテンツにJSONのみを使用する(つまり、フォームエンコードされたペイロードがない)Webサービスを構築しています。
以下が当てはまる場合、WebサービスはCSRF攻撃に対して脆弱ですか?
トップレベルのJSONオブジェクトを持たないPOST
リクエスト、たとえば{"foo":"bar"}
は、400で拒否されます。たとえば、コンテンツ42
を含むPOST
リクエストしたがって、拒否されます。
application/json
以外のコンテンツタイプを持つPOST
リクエストは400で拒否されます。たとえば、コンテンツタイプapplication/x-www-form-urlencoded
を持つPOST
リクエストは拒否されます拒否されました。
すべてのGET要求は Safe になり、サーバー側のデータは変更されません。
クライアントはセッションCookieを介して認証されます。Webサービスは、POST JSONデータを使用して、たとえば[{"username":"[email protected]", "password":"my password"}
。]を介して正しいユーザー名/パスワードのペアを提供した後にそれらを提供します。
補助的な質問:PUT
およびDELETE
リクエストはCSRFに対して脆弱ですか?ほとんどの(すべての?)ブラウザーがHTMLフォームでこれらのメソッドを許可していないようだからです。
編集:項目#4を追加しました。
編集:これまでのところ多くの良いコメントと回答がありますが、このWebサービスが脆弱な特定のCSRF攻撃を提供した人はいません。
フォームのメソッドはGETおよびPOSTに制限されている および フォームのPOST=メッセージボディも3つの形式application/x-www-form-urlencoded
、multipart/form-data
、およびtext/plain
。ただし、 フォームデータエンコーディングtext/plain
有効なJSONデータを含むリクエストを偽造することは引き続き可能です 。
したがって、唯一の脅威はXHRベースのCSRF攻撃によるものです。そして、それらは次のいずれかである場合にのみ成功します
両方を削除できる場合、WebサービスはCSRFに対して脆弱ではありません。少なくとも、ウェブブラウザ経由で実行されたものではありません。
はい、可能です。ターゲットサーバーへの307リダイレクトを被害者のマシンに送り返す攻撃者サーバーをセットアップできます。 Formを使用する代わりに、Flashを使用してPOSTを送信する必要があります。
リファレンス: https://bugzilla.mozilla.org/show_bug.cgi?id=1436241
Chromeでも機能します。
Ajaxを使用して、JSONベースのRestfulサービスでCSRFを実行することができます。これをアプリケーションでテストしました(ChromeとFirefoxの両方を使用)。プリフライトリクエストを利用するには、contentTypeをtext/plainに、dataTypeをJSONに変更する必要があります。リクエストですが、セッションデータを送信するには、ajaxリクエストでwithCredentialsフラグを設定する必要があります。これについては、ここで詳しく説明します(参照は含まれます)。
http://wsecblog.blogspot.be/2016/03/csrf-with-json-post-via-ajax.html