web-dev-qa-db-ja.com

ナンスとキャッシュ

フォーム送信とAJAXリクエスト、特に賢明なリクエストは、特定の悪用を避けるために "ナンス"が必要であることは明らかです。しかし、キャッシングシステムを多用すると、キャッシングシステムの代わりにそれらを生成して新しいナンスを出力するのが難しくなります。

問題を解決するために、フォームが送信される前に要求される、新しいナンスを返すAJAX関数を作成することを考えました。この一回だけが隠しフィールドとしてフォームに追加されます。

あなたはそれが安全なアプローチだと思いますか?

新鮮な一回だけを返すPHP関数:

function create_nonce() {
    return wp_create_nonce('my-nonce');
}

add_action('wp_ajax_create_nonce', 'create_nonce');
add_action('wp_ajax_nopriv_create_nonce', 'create_nonce');

フォームを送信します( request() は、私が簡単にajaxリクエストを作成するために作成したカスタム関数です)。

$('form').on('submit', function(e){
    e.preventDefault();
    var $form = $(this);

    request('create_nonce', function(nonce){
         // Append the fresh nonce to the form
         $form.append('<input type="hidden" name="nonce" value="'+nonce+'">');

         // Proceed with the form submission...
    });
});
3
gyo

私はこの質問が古くからあることを知っています、しかし、いいえ、それはそれほど安全ではありません。

AJAXエンドポイントを知っている人なら誰でも有効なナンスを生成することができるでしょう。それはそもそも目的を破ります。

そうは言っても、ノンスはそもそも低レベルの防御であり、最も単純な攻撃を阻止するだけです。巧妙な攻撃者は、最初にあなたのホームページをクロールし、すべてのnonce(最近では24時間のデフォルトの寿命を持っています)をじゃまにした後、そのnonceを攻撃に使用するだけでした。 AJAXエンドポイントを使用すると、そのタスクが少し簡単になります。

編集

Janhが指摘したように、nonceがユーザー固有である限り、nonceは特定のユーザーに対してのみ機能することを意味します。そうであれば、ajaxが生成したnonceは問題ないはずです。ただし、おそらくAJAXエンドポイントを介してもう少し情報を送信する必要があります。そのため、返されたnonceは正しいユーザーに関連付けられています。

0
DarkNeuron