いいえ、同じではありません。
ノンスはリプレイ攻撃を防ぎます(盗聴者が署名されたリクエストを保存して後で再送信するのを防ぎます。たとえば、アリスが「Pay Bob $ 100」を送信した場合、誰かにその100回の再送信を望まない)。
CSRFトークンは、ユーザーのアクションの認証におけるHTML固有の弱点にパッチを当てます。この場合、サードパーティのWebサイトは、サイトを表示しているユーザーの資格情報を使用してフォームを送信できます(たとえば、evil.example.comのJavaScriptが、ブラウザーを使用してfacebook.comにフォームを送信します。 )。
CSRFトークンは秘密にする必要があります。そうしないと、攻撃者はリクエストを偽造するために必要な欠落部分を持ってしまいます。
ナンスは、リクエスターのシークレットで署名されている場合、シークレットである必要はありません(攻撃者が1つのナンスを別のナンスに置き換えることができない場合)。
CSRFトークンを使用してリクエストの再生を許可し、CSRFから保護することができます(これがユーザーによる意図的なアクションであるかどうかに関心がありますが、必ずしもユーザーによる実行を何度も停止したくない場合があります)。
実際、これは非常に便利なプロパティです。たとえば、ユーザーが[戻る]ボタンを使用して、修正された値でフォームを再送信できるようにします。NonceのようなメカニズムでCSRF保護を実装すると、ユーザーが送信されたページを更新したときに誤ったアラームが発生します。
NoncesなしでCSRFを防ぐ簡単な方法は、セッションIDを非表示のフィールドに配置することです(セッションに格納されている値ではなく、セッション自体のIDで、Cookieに格納されているものと同じです[ session_id()
PHP])。フォームが送信されたら、フォームのセッションIDがCookieのIDと一致することを確認してください。攻撃者はCookieの値を知ることができないため、CSRFにはこれで十分です(CSRFでは、攻撃者は盲目的にCookieを送信することしかできません)。