web-dev-qa-db-ja.com

JavaScriptを使用してクライアントでダブルCookie CSRFトークンを生成できますか?

フォームを送信する直前にJavaScriptでCSRFトークンを作成することに問題はありますか?例:

var csrf_token = Math.random();

// Write csrf token to cookie.

// Add csrf token to the form being submitted.

// Submit form.

// Verify cookie csrf to form csrf on the server.

// When request is done; remove the cookie.

// Rinse and repeat.

これはXSSに対して脆弱であることを理解していますが、XSSはカスタム値を含むフォームを送信するだけでよいため、XSSを使用することはさらに悪いことです。

8
unska

これはお勧めしません。トークンが何らかの保護を提供するためには、予測不可能である必要があります。 Math.random()は暗号的に安全ではありません-攻撃者がランダムな値の負荷を生成し、パターンを検出し、以前の値を推測して秘密トークンの値を見つけることができないという保証はありません。これは「クロスドメインMath.random()予測」と呼ばれ、詳細については here および here を参照してください。

私は(確かではありませんが)ほとんどの最新のブラウザーが実際にはこれから保護すると思いますが、これはアプリケーションのセキュリティに賭けない実装の詳細です。実際、 MDNは警告します それ:

Math.random()は、暗号で保護された乱数を提供しません。セキュリティに関連するものには使用しないでください。代わりにWeb Crypto APIを使用し、より正確にはwindow.crypto.getRandomValues()メソッドを使用します。

それで、あなたは単にgetRandomValues()に切り替えることができますか? 80%ブラウザサポート で問題がない場合のみ。

これを行う前に、代わりにサーバーでトークンを生成できない理由を自問してください。とにかくクライアントアプローチを採用する場合は、少なくとも次の2つの落とし穴を避けてください。

  • フォームにトークンがなく、Cookieにトークンがないことを確認してください。どちらも空の文字列であるため、ナイーブな等価性チェックでは合格する可能性がありますが、脆弱性が発生します。
  • ページを読み込んでフォームを自動的に送信し、プロセスにトークンを追加するURLがあってはなりません。このようなURLは悪用される可能性があります。
3
Anders