0

最初にいくつかのコンテキスト。ナンスにアクションをアタッチできる
のと同じ方法で、ナンストークンを使用してフォームデータに署名しています。wordpress

// editing post id:10
$post_id = 10;
$nonce = create_nonce( 'edit-post-'.$post_id );
echo '<input type="hidden" name="post_id" value="'.$post_id.'">';
echo '<input type="hidden" name="nonce" value="'.$nonce.'">';

これにより、後でユーザーが許可を与えた投稿を編集しているかどうかを確認できます。これは、ナンスを再構築し、受け取ったナンスが作成したものと同じかどうかを確認するためです。

$server_nonce = create_nonce( 'edit-post-'.$_POST['post_id'] );
if( $server_nonce != $_POST['nonce'] )
{
    echo 'bad guy...';
}

これまで、私はこの方法を、CSRF保護を提供する反CSRFトークンと誤解していました。
CSRFの問題を深く掘り下げてみると、このソリューションではCSRFから100%保護されていないことがわかりました。理由は次のとおりです。

  1. ナンスは、受信したデータを使用してサーバーで再構築できます。CSRFを再構築してはなりません。
  2. ナンストークンは、ウィンドウ時間のフォームでも同じになります。CSRFは、リクエストごとに一意である必要があります。

だから、ここに私の質問があります:

CSRFとデータ署名から保護するためにフォームで2つのトークンを使用しても大丈夫ですか?これらの2つのトークンを組み合わせる方法はありますか?

4

1 に答える 1

1

通常、ナンスはサーバー側のどこかに保存する必要があります。検証時に nonce を再生成している場合、それは nonce が入力に基づく予測可能な値であることを意味します。これは静的な値であるため、かなり役に立ちません。nonceではありません。

ナンスが機能するはずの方法は次のとおりです。

  1. フォームを構築する
  2. ランダムな値、ノンスを生成します
  3. ナンスをセッションに保存、フォームの非表示フィールドに入れます
  4. フォームの送信時に、送信されたノンスがセッション内のものに対応していることを確認します

それ以外は、action+post-id のチェックサムに過ぎず、まったく役に立ちません。

送信されるフィールドのチェックサムを使用して、この適切なナンス手順を簡単に拡張できます。これには、予想されるすべてのフィールドの名前とその他の予想される静的な値を取得し、それらのハッシュもセッションに追加します。例えば:

sha1(join(',', array('first_name', 'last_name', $nonce)))

フォームの送信時に、受信したすべてのフィールド名を取得し、同じハッシュを再度生成して、セッションのものと同一かどうかを確認します。そうでない場合は、誰かがフォームを改ざんしています。

于 2012-10-24T15:25:50.537 に答える