IEには影響するがChromeには影響しないという奇妙な問題があります(他のブラウザは試したことがありません)。
私は以下のコードを使用してnonce付きのフォームを生成しています -
<?php wp_nonce_field('solution-reg') ?>
私は現在、$_REQUEST
配列全体をブラウザに出力するコードを持っているので、nonceフィールドがフォームデータと共に送信されているのがわかります -
Array ( [_wpnonce] => a7250b35a1 [_wp_http_referer] => /path-removed-for-stackexchange/ [..more fields..] )
私のコードでは、私は次のように検証関数を呼んでいます
if( !wp_verify_nonce($_POST['_wpnonce'], 'solution-reg') ){
$this->renderer->addData('error', __('Invalid request', '...'));
return false;
}
Chromeではこれを失敗させることはできず、すべての試みは次のページに問題なく進みます。 IEでは、最初のリクエストで常に「無効なリクエスト」エラーが発生します。もう一度フォーム送信ボタンを押すとうまくいきます。
影響を与える可能性がある他の唯一のものは、フォームのdata-validate="1"
ハンドラーによってトリガーされる.submit
属性で任意のフォームフィールドをチェックするJavaScriptですが、それは私ができるフォームに渡されるnonce値に影響を与えないようです。それが一回だけの検証にどのように影響するかを見てください。
私は本当にIEが異なったことをしているかもしれないことを見るのに苦労しています。
編集:( TL/DR私はあきらめる)
Wp_create_nonceの呼び出しをログに記録すると、IEでページをロードしても呼び出されないことが示唆されるようです。ランダムなクエリ文字列変数を追加すれば問題ありません。これはどこかにキャッシュすることを示唆しますが、私はそれを理解していません。ヘッダーにmax-age 0, no-cache
と即時有効期限が表示されます。 Total Cacheプラグインは有効になっていますが、クロムが問題ないのでそれを確認できません。他に答えがないので、結果的にnonceを無効にしました。
ログインしていないユーザーにはnonceを使用しないでください。フルページキャッシュまたは部分ページキャッシュのシナリオでは、ナンスを使用しないでください。何度も表示されている印象とは異なり、特別な理由もなくあちこちにノンスを振りかけてもサイトのセキュリティは向上せず、ログインしていないユーザーには実際に問題が生じる可能性があります。