最初にいくつかのコンテキスト。ナンスにアクションをアタッチできる
のと同じ方法で、ナンストークンを使用してフォームデータに署名しています。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%保護されていないことがわかりました。理由は次のとおりです。
- ナンスは、受信したデータを使用してサーバーで再構築できます。CSRFを再構築してはなりません。
- ナンストークンは、ウィンドウ時間のフォームでも同じになります。CSRFは、リクエストごとに一意である必要があります。
だから、ここに私の質問があります:
CSRFとデータ署名から保護するためにフォームで2つのトークンを使用しても大丈夫ですか?これらの2つのトークンを組み合わせる方法はありますか?