WP REST APIとAngularJSを使用して単一ページのアプリを作成しています。 この質問 にnonceを使って問題を解決した後、今私は何か他のものに直面しています。フィールドを追加してログに記録されていないユーザーから保護する機会をテストするために、wp_verify_nonce
の結果を公開するカスタムフィールドを作成しようとしました。
if (isset($_SERVER['HTTP_X_WP_NONCE'])) {
$nonce = $_SERVER['HTTP_X_WP_NONCE'];
$nonce_verified = wp_verify_nonce($_SERVER['HTTP_X_WP_NONCE'], 'wp_rest');
}
return array('nonce' => $nonce,
'nonce_verified' => $nonce_verified);
もちろん、これはテストであり、そのままになります。 Nonceが公開されているのでnonce_verified
もそうです。この時点で、私はユーザーにログイン/ログアウトし、このエンドポイントとusers/meを要求しました。しかし、私のノンスは常にログインユーザーまたはログアウトユーザーのどちらかで検証されることが起こりました。これをしている間nonceそれ自身は変わる。それでも、ログアウトしたとき、それはその生涯を通して同じです。
私のnonceを作成するために、私は私の前の質問のようにローカライズされたコードを使いました:
wp_localize_script('angularjs', 'params', array(
'nonce' => wp_create_nonce('wp_rest'),
));
angularJSに関するチュートリアルで見たように、これはJavaScriptを介して渡されます。このナンスは検証されますが、users/me
へのクエリでは、ログに記録されていないと予想どおり403が返されます。
私の理論では、ログに記録されていないユーザーのためのナンスが作成されているので、常に利用可能な有効なナンスがあります。私はis_user_logged_in()
で一回だけの創造を守るべきですか?それとも私はどこかの一回限りの創造を引っ掛けるべきですか?ありがとうございました。
ログインしていないユーザーにnonceを使用しない本当の理由は、nonceが期限切れになったときにページを更新する必要があるため、使用に無意味な負担がかかることです。何かがうまくいかない。
おそらくそれを生成するのを避ける理由はありませんが、あなたがあなたの "app"が12時間以上使われる/開くことを期待するなら(それはwordpressのナンスを計算するのに使われる "tick"時間です)自動的にnonceを更新する方法(ログインしているユーザーにとっても良い方法かもしれません)、あるいはそもそもそれを使わないようにします。
WordPressのnonceは本物のnonceではありません、それらは12〜24時間有効で、ウェブサイトのすべての訪問者(ログインしていないユーザー)のSAMEの値を返します。 。そのため、各アクションに新しい番号が必要な場合や、アプリケーションでゲストユーザーを操作している場合は、セキュリティ対策としてWP nonceを使用しないでください。
私はこれがここでどのように働くかを深く説明します: https://www.bynicolas.com/code/wordpress-nonce/
このプロジェクトを見てみたいと思うかもしれません https://github.com/calevans/wp-simple-nonce もしあなたがあなたのプロジェクトに本当のナンスを加えたいのであれば
コーデックスからのEDIThttps://codex.wordpress.org/WordPress_Nonces
ナンスは、認証または許可、アクセス制御に依存してはいけません。