web-dev-qa-db-ja.com

Nonceに関する混乱と、チェックボックスの値をPost Metaに保存するためのカスタム列での使用

私はナンスを使用する複数の方法があると思います。

最近私はwp_nonce_field('any_nonce_value');を使いました

これは<input type="hidden" id="_wpnonce" name="_wpnonce" value="111bc61eba">を作成します

そしてそれはcheck_admin_referer('any_nonce_value');を使って確認することができます

別の方法は<input type="hidden" name="_wp_nonce_or_anything_we_desire" value="<?php echo wp_create_nonce('any_nonce_value'); ?>">を使うことです

これはwp_nonce_verify($_POST['_wp_nonce_or_anything_we_desire'], 'any_nonce_value')を使って確認できます。

ノンスについての私の理解は正しいですか? これが混乱です

カスタムメタボックスを作成しようとしているとき、カスタム列を追加し、カスタム列を管理し、最後に投稿を保存します。どこに私たちは一回だけ通過する必要がありますか。私の質問をより明確にするために。

Save_postに接続すると、 https://codex.wordpress.org/Plugin_API/Action_Reference/quick_edit_custom_box に次のような部分コードが提案されます。

 $_POST += array("{$slug}_edit_nonce" => '');
    if ( !wp_verify_nonce( $_POST["{$slug}_edit_nonce"],
                           plugin_basename( __FILE__ ) ) )
    {
        return;
    }

それで、我々はカスタムnonceを作成するべきですか?メタボックスを作成しながら?それとも、ここでカスタム投稿タイプのスラッグを使用し、残りはWordpressで管理する必要がありますか。あなたの役に立つ答えを楽しみにしていて、それは私のような他の多くの人々を助けてくれることを願っています!ありがとう。

1
Adnan

カスタムメタボックスを作成しようとしているとき、カスタム列を追加し、カスタム列を管理し、最後に投稿を保存します。どこに私たちは一回だけ通過する必要がありますか。私の質問をより明確にするために。

これは正しくありません。更新時または公開時に、すべての情報が完全な要求で一度に送信されるため、メタボックスでナンスを使用する必要はありません。WPはすでにそれを処理します。

私がここで混乱しているのは、ノンスが何から保護することになっているのか、そしてなぜそれが使われているのか説明されていないということだと思います。


Myspaceの頃は、あなたのプロフィールに画像タグを入れてsrc="http://myspace.com/logout"を設定すれば、あなたのプロフィールを訪れた人は誰でもログアウトされるでしょう。

一方、nonceは時間に敏感な値であり、ボタンをクリックしたことを確実にすることでこれを防ぎます。または実際にクリックしたためにCSRF攻撃ではないことを実行しました。

あなたが何かをする何かをしているのであれば、はい、ナンスを使用してください。値を読んでいるだけならば、その必要はありません。 2つ以上の一回だけでも保護は追加されず、それゆえメタボックス

また、check_admin_refererwp_nonce_verifyは同じではありません。

  • wp_nonce_verifyは文字通り一回だけチェックします
  • check_admin_refererは内部的にwp_nonce_verifyを呼び出しますが、結果に基づいて処理を行い、失敗した場合は終了/中止します。また、参照元の値も確認します。
  • wp_nonce_verifyは一回だけチェックしてtrue/falseを返します。その値で何かをするのはあなた次第です

wp_create_nonceおよびwp_nonce_fieldと同じ

  • wp_create_nonceはナンス値を作成します。それを使って何かをするのはあなた次第です
  • wp_nonce_fieldは隠しフィールド全体を出力し、内部でwp_create_nonceを呼び出し、その他の処理を行います。

それらをbuy_brick()build wall()の違いとして考えてください。

1
Tom J Nowell