フォームを送信する直前に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を使用することはさらに悪いことです。
これはお勧めしません。トークンが何らかの保護を提供するためには、予測不可能である必要があります。 Math.random()
は暗号的に安全ではありません-攻撃者がランダムな値の負荷を生成し、パターンを検出し、以前の値を推測して秘密トークンの値を見つけることができないという保証はありません。これは「クロスドメインMath.random()
予測」と呼ばれ、詳細については here および here を参照してください。
私は(確かではありませんが)ほとんどの最新のブラウザーが実際にはこれから保護すると思いますが、これはアプリケーションのセキュリティに賭けない実装の詳細です。実際、 MDNは警告します それ:
Math.random()
は、暗号で保護された乱数を提供しません。セキュリティに関連するものには使用しないでください。代わりにWeb Crypto APIを使用し、より正確にはwindow.crypto.getRandomValues()
メソッドを使用します。
それで、あなたは単にgetRandomValues()
に切り替えることができますか? 80%ブラウザサポート で問題がない場合のみ。
これを行う前に、代わりにサーバーでトークンを生成できない理由を自問してください。とにかくクライアントアプローチを採用する場合は、少なくとも次の2つの落とし穴を避けてください。