ステートレス(=セッションレス)認証を使用する場合、CSRFトークンは必要ですか?


125

アプリケーションがステートレス認証(HMACなどを使用)に依存している場合、CSRF保護を使用する必要がありますか?

例:

  • シングルページアプリがあります(そうでない場合、各リンクにトークンを追加する必要があります:)<a href="...?token=xyz">...</a>

  • ユーザーはを使用して自分自身を認証しPOST /authます。認証が成功すると、サーバーはトークンを返します。

  • トークンは、JavaScriptを介して、単一ページアプリ内の変数に格納されます。

  • このトークンは、などの制限されたURLへのアクセスに使用されます/admin

  • トークンは常にHTTPヘッダー内で送信されます。

  • HttpセッションもCookieもありません。

私が理解している限り、ブラウザはトークンを保存しないため、クロスサイト攻撃を使用する可能性はありません(?!)。したがって、サーバーにトークンを自動的に送信することはできません(Cookies /セッション)。

何か不足していますか?


6
基本認証に注意してください。多くのブラウザは、残りのセッションで基本認証ヘッダーを自動的に送信します。これにより、基本認証がCookie認証としてCSRFに対して脆弱になる可能性があります。
2015年

回答:


159

認証にCookieを使用しない CSRF +に関する情報が見つかりました。

  1. https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/「Cookieに
    依存していないため、クロスサイトリクエストから保護する必要はありません」

  2. http://angular-tips.com/blog/2014/05/json-web-tokens-introduction/「Cookieを使用する
    場合は、CSRFを実行してクロスサイトリクエストを回避する必要があります。これは、 JWTを使用するときに忘れないでください。」
    (JWT = Json Web Token、ステートレスアプリのトークンベースの認証)

  3. http://www.jamesward.com/2013/05/13/securing-single-page-apps-and-rest-services
    "CSRFの脆弱性を危険にさらすことなく認証を行う最も簡単な方法は、Cookieを使用してユーザーを識別するのを単に避けることです」

  4. http://sitr.us/2011/08/26/cookies-are-bad-for-you.html「CSRF
    の最大の問題は、Cookieがこのタイプの攻撃に対する防御をまったく提供しないことです。Cookie認証を使用している場合また、CSRFから保護するために追加の対策を講じる必要があります。取れる最も基本的な予防策は、アプリケーションがGETリクエストに応答して副作用を実行しないことを確認することです。」

認証にCookieを使用しない場合は、CSRF保護が必要ないことを示すページは他にもたくさんあります。もちろん、他のものすべてにCookieを使用することはできますが、そのようなものを保存することは避けてくださいsession_id


ユーザーを覚えておく必要がある場合は、2つのオプションがあります。

  1. localStorage:ブラウザー内のKey-Valueストア。保存されたデータは、ユーザーがブラウザウィンドウを閉じた後でも利用できます。すべてのサイトが独自のストレージを取得するため、他のウェブサイトからデータにアクセスすることはできません。

  2. sessionStorage:ブラウザ内のデータストアにもあります。違いは、ユーザーがブラウザウィンドウを閉じるとデータが削除されることです。ただし、Webアプリケーションが複数のページで構成されている場合は、それでも役立ちます。したがって、次のことができます。

    • ユーザーがログインしてから、トークンを保存します sessionStorage
    • ユーザーがリンクをクリックすると、新しいページがロードされます(= 実際のリンク、JavaScriptコンテンツの置き換えなし)
    • 引き続きトークンにアクセスできます sessionStorage
    • ログアウトするには、トークンを手動で削除するかsessionStorage、ユーザーがブラウザウィンドウを閉じるのを待つことができます。これにより、保存されているすべてのデータが消去されます。

(どちらもここにあります:http : //www.w3schools.com/html/html5_webstorage.asp


トークン認証に公式の基準はありますか?

JWT(Json Web Token):まだ草案だと思いますが、すでに多くの人が使用していて、コンセプトはシンプルで安全に見えます。(IETF:http : //tools.ietf.org/html/draft-ietf-oauth-json-web-token-25
利用可能な多くのフレームワーク用のライブラリもあります。ただググって!


37
CSRFのすばらしい要約!トークンをlocalStorageまたはsessionStorageに保存することはXSS攻撃に対して脆弱であり、データはページ上のスクリプトによって表示される可能性があることに注意してください-したがって、CDNから提供されたスクリプトが侵害されている場合、または悪意のあるコードがJSライブラリーは、それらの保管場所からトークンを盗むことができます。参照:stormpath.com/blog/…最も安全なアプローチは、JWT + CSRFトークンをCookieに保存し、CSRFトークンを含む計算されたJWTをリクエストヘッダー内のCSRFトークン内に配置することです。
アーロングレイ

について:「あなたが取ることができる最も基本的な予防策は、アプリケーションがGETリクエストに応答して副作用を実行しないことを確認することです。」CSRF攻撃がPOSTリクエストを偽装することは可能ですか?
コスタ

サーバー側のアプリケーションによっては、それが可能になる場合があります。のようなものを使用するWebフレームワークがありますhttp://.../someRestResource?method=POST。つまり、基本的にはGETリクエストですが、サーバーアプリケーションはHTTPヘッダーの代わりにパラメータPOSTを使用するように構成されているため、リクエストとして解釈しmethodます。...一般的なWebブラウザーに関しては、Same-Origin-Policyを適用し、GET外部サーバーへのリクエストのみを実行します。しかし可能性があり、実行することが可能にPOSTリクエストを場合は、Webブラウザは、これらのWeb標準(バグ、マルウェア)が適用されません。
ベンジャミンM

1
への追加Server Side App:一般的なブラウザではこれが許可されていないため、リクエストボディを送信することはまだ不可能です。ただし、サーバーアプリmethod=POSTでが許可さbody={someJson}れている場合は、デフォルトのリクエスト本文をオーバーライドすることもできます。それは本当に悪いAPIデザインであり、非常に危険です。ただし、サーバーアプリで許可されhttp://...?method=POST&body={someJson}ている場合は、そこで何をしたのか、その理由、そしてそれが必要なのかどうかを本当に考え直すべきです。(私は99,9999%の場合、それ必要ではないと思います)。さらに、ブラウザはこの方法で数キロバイトしか送信できません。
ベンジャミンM

要求は、それが実際にサーバに到達した「ブロック」されながら同一生成元ポリシーはだけなので、結果にアクセスするJavaScriptコードを防止することを@BenjaminM通知- jsbin.com/mewaxikuqo/edit?html,js,output私はFirefoxのみでこれをテストし、しかし、開発ツールを開いて、「クロスオリジンリクエストがブロックされました」と表示された場合でも、リモートサーバーが実際にリクエスト全体を確認できます。そのため、すべてのPOSTリクエストに対してトークンまたはカスタムヘッダー(および可能であれば両方)が必要です
Yoni Jah

59

TL; DR

JWTをCookieなしで使用すると、CSRFトークンの必要性がなくなります-しかし!JWTをsession / localStorageに保存することで、サイトにXSSの脆弱性がある場合(かなり一般的)にJWTとユーザーのIDを公開します。csrfTokenJWTにキーを追加しsecurehttp-only属性が設定されたCookieにJWTを保存することをお勧めします。

詳細についてはこの記事をよく読んでください https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage

xsrfToken JWTクレームを含めることで、このCSRF保護をステートレスにすることができます。

{ "iss": "http://galaxies.com", "exp": 1300819380, "scopes": ["explorer", "solar-harvester", "seller"], "sub": "tom@andromeda.com", "xsrfToken": "d9b9714c-7ac0-42e0-8696-2dae95dbc33e" }

したがって、csrfTokenをlocalStorage / sessionStorageとJWT自体(httpのみで安全なcookieに格納されている)に格納する必要があります。次に、csrf保護のために、JWTのcsrfトークンが送信されたcsrf-tokenヘッダーと一致することを確認します。


2
ユーザーのAPI認証中にcsrfトークンの使用を免除する必要がありますか?
user805981 2016

3
(他の人もソースリンクのコメントで言及しているように)a)httpのみではないcookieを使用するCSRF緩和策またはb)ローカルストレージにCSRFトークンを保存することは、XSSに対して脆弱であることを指摘する価値があります。つまり、提示されたアプローチは、XSSを使用して攻撃者からJWTを秘密に保つのに役立つ可能性がありますが、攻撃者は有効なJWTを(Cookieを介して、ブラウザーに感謝して)提供できるため、APIで悪意のあるリクエストを実行することができます。およびCSRFトークン(ローカルストレージ/ Cookieから挿入されたJSを介して読み取り)。
ヨハネスルドルフ

1
実際には、攻撃者がlocalStorageにアクセスできると想定しているため、CSRFトークンでもこのレベルのXSSで保護することはできません。localStorageは現在アクセスできる唯一の方法であり、スクリプトレベルのアクセスがあり、とにかくCSRFトークンを確認できます。 。
無効な

1
@JohannesRudolphが言っていたのではないですか?CSRトークンをWeb Storage / non-http-only cookieに保存するとすぐに、JS経由でアクセスできるため、XSS攻撃のフットプリントが増加します。
adam-beck 2017年

1
あなたが最初にあったようにあなたはまだXSSにさらされている場合ではない、ここで合計の専門家は、しかし、私は確信して一部ではないよ...追加した方が良いです、本当に成り立ちます。おそらく、攻撃者がCSRFトークンを取得するのは少し(?)より複雑ですが、最終的には、実際にJWTトークンを知らなくても、攻撃者はあなたに代わってリクエストを実行できます。あれは正しいですか?ありがとう
superjos 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.