18

私が開発している現在のアプリケーションをより安全にするために、CSRFトークンとNonceについて読んでいます。

私の質問は、CSRFトークンとNonceは同じものですか?私がこれまでに収集できたものから、これらの方法は両方とも同じ目標を達成するための異なる技術を持っているということですか、それとも私は何かを誤解していますか?

それらが異なる場合は、サンプルコードを提供するか、PHPアプリでノンスを実装する方法について詳しく知ることができるいくつかのリンクを教えていただけませんか。

ありがとう!

4

4 に答える 4

17

いいえ、同じではありません。

ノンスはリプレイ攻撃を防ぎます(盗聴者が署名されたリクエストを保存して後で再送信するのを防ぎます。たとえば、アリスが「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を送信することしかできません)。

于 2012-03-21T11:14:38.720 に答える
16

ノンスは通常、署名の計算に使用されるデータを予測できない方法で変更するためだけに要求するために追加されるランダムな文字列です。したがって、nonceは通常、サーバー側のビジネスロジックでは使用されません。

CSRFトークンはサーバーのどこかに保存されていますが、クライアントに渡され、比較するためにサーバーに戻す必要があります。そして、一致する場合-それならOK。

したがって、あなたの場合は、csrfトークンを次のようなセッション変数に1回保存する方がよいでしょう。

$_SESSION['csrf_token'] = bin2hex(random_bytes(16));

そして、アプリケーションにあるすべての形式で、セッション中に変更せずに使用します。

(持っていない場合は、 random_compatrandom_bytes()を使用してポリフィルします。)

于 2011-04-17T04:39:30.927 に答える
8

それは同じようなものです。「nonce」は、ワンタイムパスワードそのものです。これは暗号ソルトとして機能できますが、基本的には単なるランダムな値です。WP:Nonceを参照してください

しかし、要約すると、ナンスはCSRFトークンとしてよく使用されます。これは実装の詳細です。他のユースケースとの違いは、後でアサートされることです。

于 2011-04-17T04:51:53.057 に答える
0

CSRFにはいくつかの制限があります。新しいタブでページまたはリンクを開きたいという要件がある場合、CSRFは許可しません。既存のトークンでは、新しいタブでページを5回だけ開くことができます。6回目に開こうとすると、「サーバー側=クライアント側トークン」と一致しない新しいトークンが作成されます。以前のトークンは期限切れになり、新しいトークン(NONCE)が作成されます。その場合、404または405エラーが発生します。

于 2019-06-28T09:13:42.047 に答える