私のアプリケーションは、Cookieではなくトークンを使用するAPI認証を実行しています。
これは私にいくつかの質問をするように導きます:
ランダムトークンを使用することで、CSRF攻撃の問題を排除できますが、反対側にはSecure
およびHTTPOnly
フラグはありません。
新しいECMAScript Harmony Object.freeze()
およびObject.seal()
機能を使用して、何らかのトリックを使用することを考えたが、これは安全なものよりもハックのように思われる。
Socket.io
のようなWebSocket
クライアントを認証するにはどうすればよいですか?Socket.io
、ws
、Sockjs
、Faye
などのほとんどのライブラリは、カスタムHTTPヘッダーを設定できないか、Flashソケットなどのさまざまなフォールバックプロトコルと互換性がありません。
1つの可能性は、URLのクエリ引数でハンドシェイクの一部としてトークンを送信することですが、それは次のことを意味するため、私は本当に好きではありません。
1)-トークンは、URLのみを記録するログファイルに表示されます
2)-最初にハンドシェイク中に認証し、次に2つの別々のシステムを意味するデータを送信するたびに認証する必要があります。
それについて少し考えれば、それは私の頭の上にあります。さらに根本的な問題があるかもしれません。
公開鍵/秘密鍵システムを使用して、ある種の非対称方式を実装することもできますが、これは信頼性の高いソリューションになるためにエラーが発生しやすい/複雑なようです。
私の最後の質問は、上記の質問の結果の詳細です:
一方では、CSRF攻撃の脆弱性はありませんが、他方では、(少なくとも私にとっては)答えがそれほど明確ではないように見える他の多くのケースがあります。
前もって感謝します !
トークンを保存するには:
従来の(Ajax以外の)Webアプリの場合、通常は非表示のフォームフィールドにトークンを格納します。
シングルページアプリの場合、通常はトークンをJavaScript変数に格納し、各リクエストでJSONデータにトークンを含めます。
このアプローチは、トークンがURLに含まれることを回避し、WebSocketで機能します。
ほとんどのアプリケーションはメインセッションIDとしてCookieを使用し、純粋にCSRFを防ぐための2番目のトークンを持っています。 Cookieを破棄して、トークンを単独で使用することもできますが、これは標準的な方法ではないため、何をしているのかがわかっている場合にのみ行うようにしてください。
おっしゃるように、Cookieには、トークンでは不可能なHttpOnlyオプションがあります。トークンには安全なフラグはありませんが、SSL経由でのみ送信されるようにコードを調整できるため、それほど重要ではありません。
もう1つ注意する必要があるのは、主に Originヘッダー を使用して、トークンを使用せずにCSRFを防止できることです。ただし、ほとんどのサイトはまだトークンを使用しています。
WebSocketを使用して通常のCookie認証を行うことができます。 この質問 にはいくつかの情報があります。これがCSRFにどのような影響を与えるのかわかりません。