rararan998
フォーラムへの返信
-
フォーラム: 使い方全般
返信が含まれるトピック: 「nonce」の使い方についてなー…る、ほど。上のユーザーループならばできそうな予感がします。
my_enqueue_scripts_ajax()
の中で、$author_id_arr
を取得すればいいということです、よ…ね?ありがとうございます!
あとは記事ループもありまして、ここでは執筆者としてユーザーIDが出力されています。
こちらのユーザーIDは、
ユーザーループのように「
$author_id_arr
から取得される」のではなく、「記事ループのWP_Queryから取得される」(記事ループの中で
get_post_field( 'post_author', get_the_ID() );
として取得される)ことになりますが、この場合ですといかがでしょうか。
my_enqueue_scripts_ajax()
の中で、記事ループ内のget_post_field( 'post_author', get_the_ID() );
は、取得できますでしょうか?フォーラム: 使い方全般
返信が含まれるトピック: 「nonce」の使い方について迅速なご返信に心より感謝申し上げます。
なるほどグローバル変数にするんですね。
(こちらはスマートさを判断できるレベルではないので気にしないでください。笑)ただ「このユーザーを許可」のボタンはユーザー一覧ページに出てくるボタンで、その
$target_id
はget_header()
より後の、ユーザーループ↓の中に書かざるをえなそうです。<?php // $author_id_arr はユーザーIDがたくさん入ってます if ( isset($author_id_arr) ) : ?> <ul class="users"> <?php foreach ( $author_id_arr as $author_id => $key ) : ?> <li> <div class="user_avatar"> <?php echo_avatar( $author_id );?> </div> <?php $target_id = $author_id; ?> <div class="user_actions"> <?php echo_button( $target_id, 'allow' ); ?> </div> </li> <?php endforeach; ?> </ul>
でもこのようなケース(POSTされるユーザーIDを改ざんされないように、nonceにユーザーIDを含める)はよくありそうに思うのですが、どう解決してるんでしょうね。
フォーラム: 使い方全般
返信が含まれるトピック: 「nonce」の使い方について$target_id が何か不明
失礼致しました。
$target_id
はユーザーのIDです。「このIDを許可」の、「どのIDか」を$target_id
で指定します。そしてたしかに、
my_enqueue_scripts_ajax()
の中で$target_id = ???
とすれば動的になるとは思うのですが、その$target_id
は、my_enqueue_scripts_ajax()
の中でしか使えませんよね。しかし
$target_id
は、前述のようにボタンを出力するときに「どのIDか」を示すためにも出力しておかなければなりません。つまり、「ボタンを出力する
function echo_button( $target_id, $action_name ){}
の$target_id
」と、「nonceを出力するwp_create_nonce( "my_ajax_action_{$target_id}_allow" )
の$target_id
」を、同じにしなければならない。ということなんです。たとえば、ボタンを出力するときに次のようにします。
これはpage.phpに書かれているものだとします。<?php $target_id = '1'; ?> <div class="user_actions"> <?php echo_button( $target_id, 'allow' ); ?> </div>
このボタンの
$target_id
を、nonceの$target_id
と、同じにすることはできないのではないでしょうか?先ほどの「動的に」とは、このような「ボタンの
$target_id
と、nonceの$target_id
を同じにする」という意味で申し上げたかったんです。わかりにくくて本当に申し訳ございません。
フォーラム: 使い方全般
返信が含まれるトピック: 「nonce」の使い方についてこんばんは。どこまでが変数名なのかを明示的に示すとは、なるほどよく考えられてますね。ありがとうございます。
フォーラム: 使い方全般
返信が含まれるトピック: 「nonce」の使い方について最後に1点教えてくださいませ。
「または」の方ではボタンごとのnonceを、ボタンと一緒に出力せずに、
my_enqueue_scripts_ajax()
を介してコメントアウトの形で次のように出力しているわけですよね。このように。'allow_nonce' => wp_create_nonce( 'my_ajax_action_1_allow' ), 'add_nonce' => wp_create_nonce( 'my_ajax_action_1_add' ),
しかしこの「1」は動的に変化します。上述した
function echo_button( $target_id, $action_name ){}
の、$target_id
がそれです。(https://ja.wordpress.org/support/topic/%E3%80%8Cnonce%E3%80%8D%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/page/2/#post-234997)なのでやはり、ボタンごとのnonceを出力するには、ボタンと一緒に出力するしかないのではないでしょうか?
my_enqueue_scripts_ajax()
を介してコメントアウトの形で出力することはできないのではないでしょうか?それともここ(↓●)を動的に変化させる方法などありますでしょうか?
'allow_nonce' => wp_create_nonce( 'my_ajax_action_●_allow' ), 'add_nonce' => wp_create_nonce( 'my_ajax_action_●_add' ),
この「動的なid」について、もしお時間ございましたら最後に教えて頂けますと幸いでございます。何卒…
フォーラム: 使い方全般
返信が含まれるトピック: 「nonce」の使い方についてなるほどこのようにチェックできるんですね。
if ( check_ajax_referer( "my_ajax_action_{$target_id}_{$action_name}", 'nonce', false ) ) {
変数を{}で囲む(
{$target_id}
や{$action_name}
など)はどういった効果が期待されるテクニックなのでしょうか。初めてみました。大変勉強になります。どうもありがとうございます。そしてお二方のご高察ではボタンごとにnonceを出力するときに、ボタンと一緒に出力するのはよろしくないとのこと。
そこで、それをやめたのが「または」のコードになるわけですね。
つまりボタンと一緒に出力するのをやめて、my_enqueue_scripts_ajax()
を介してコメントアウトの形で出力したぞと。どうもありがとうございます。大変わかりやすかったです。やっと全体の流れが理解できました。
フォーラム: 使い方全般
返信が含まれるトピック: 「nonce」の使い方について@munyagu さん
POST データを取得する方法は以下サイトを参照して下さい。
POST データはわかります。
$action_name = esc_html( $_POST['action_name'] ); $target_id = esc_html( $_POST['target_id'] ); $check_nonce = $action_name.$target_id;
などですよね。
お聞きしたいのは次のことです。(すみません重複した内容ですが)
まずチェックの方法について、質問のコードではこうしていますよね。
if( check_ajax_referer($action, 'nonce', false) ) {
でもこうしてチェックされるnonceは、
my_enqueue_scripts_ajax
が発行する1つのnonceに対してのチェックだけだと思うんです。(つまり2つ前の返信のJSにあるnonce: MY_AJAX.nonce,
です。)でも今回はボタンごとに個別のnonceをチェックしたいわけです。(つまりさきほど書いた
$check_nonce
です。)そのようなとき、
if( check_ajax_referer($action, 'nonce', false) ) {
の部分はどのように書き換えるべきか?
ということを、具体的なソースコードでもってお聞きできましたら幸いです。
少なくとも、nonce を nonce という名前で出したり、ボタンの属性として出力してセットだと分かりやすくするのはやめたらいいと思います。
あの、こればかりお聞きして申し訳ないのですが、では、どうすれば?という話に。すみません笑
フォーラム: 使い方全般
返信が含まれるトピック: 「nonce」の使い方について@munyagu さん
こんばんは。夜分に失礼いたします。
>JavaScript のソースにある MY_AJAX というオブジェクトが何か分からない
「MY_AJAX」は普通にmy_enqueue_scripts_ajax()
で作ったものです。
あ、「MY_AJAX_um」のことですか?でしたらタイプミスでそれは「MY_AJAX」の間違いです。>POST している action が何に使われるものか私には分からないので無視します。
たしかに。笑>なので、同じように POSTした action_name の後に POST した target_id をくっつければいいんじゃないでしょうか。
具体的にはどのようなソースになるということでしょうか?イメージが掴めず辛いです。>id と nonce をセットでソースに書き出している
あぁ、そうですよね。そしたら改ざんを防ぐにはどのように出力すればよいのでしょうか?フォーラム: 使い方全般
返信が含まれるトピック: 「nonce」の使い方について@munyagu さん
ありがとうございます。
「ググれば出てくる」の2点のJSは分かります。
このようなイメージですよね。$(document).on("click","button", function(){ var action_name = $(this).attr('data-action_name'); var target_id = $(this).attr('data-target_id'); var nonce = $(this).attr('data-nonce'); $.ajax({ url: MY_AJAX_um.api, type: 'POST', data: { action: MY_AJAX.action, nonce: MY_AJAX.nonce, action_name: action_name, target_id: target_id, nonce: nonce, } }) .done(function(res){ } .fail(){ } });
分からないのは、ajaxのdataを受け取ったPHPで、その送られたnonceが正しいかどうかをチェックする方法です。
チェックの方法について、質問のコードではこうしていますよね。
if( check_ajax_referer($action, 'nonce', false) ) {
でもこうしてチェックされるnonceは、
my_enqueue_scripts_ajax
が発行する1つのnonceに対してのチェックだけだと思うんです。でも今回はボタンごとに個別のnonceをチェックしたいわけです。
そのようなとき、
if( check_ajax_referer($action, 'nonce', false) ) {
の部分はどのように書き換えるべきか?
ということについてお教えて頂けますとうれしいです。
- この返信は5年、 11ヶ月前にrararan998が編集しました。理由: JSを追記
フォーラム: 使い方全般
返信が含まれるトピック: 「nonce」の使い方について@ishitaka さん
レベルが違いすぎると合わせるのが大変ですよね。すみませんでした。
フォーラム: 使い方全般
返信が含まれるトピック: 「nonce」の使い方について@munyagu さん
ボタンに個別のnonceとは、たとえばこう出力しますよね。
<?php function echo_button( $target_id, $action_name ){ $nonce = wp_create_nonce( $action_name . $target_id ); echo '<button type="button" data-action_name="'.$action_name.'" data-target_id="'.$target_id.'" data-nonce="'.$nonce.'">このIDを許可</button>'; } ?>
では上記PHPのようにして下記のボタンが出力されたとき、このnonceはどのようにしてチェックすればいいと思いますか?
<button type="button" data-action_name="allow" data-target_id="1" data-nonce="xxx">このIDを許可</button>
それについて
>ajax リクエスト時に data に含ませる
と仰ってますが、それが私にはイメージできず。。すみません。
もしよろしければサンプルを教えて頂けませんでしょうか。フォーラム: 使い方全般
返信が含まれるトピック: 「nonce」の使い方について@ishitaka さん
お世話になってます。
>アクション名に ID が入っていると思っていました。
とのことですので、やはり個別のIDでチェックする必要はあるということですね。
そのようなケースでのコードなど、簡単なもので構いませんのでよろしければお聞かせ頂けませんでしょうか。
コメントにはこのようにありますが、
アクション名: my_ajax_action+ID+動作(allow,add,other)
しかしこのIDは、
my_enqueue_scripts_ajax
が書かれているテンプレート(functionms.php)では不明なんですよね。どうやってその不明なIDをアクション名として入れればいいでしょうか。何度も申し訳ございません。
フォーラム: 使い方全般
返信が含まれるトピック: 「nonce」の使い方について@munyagu さん
どうもありがとうございます。やはりボタンごとに必要なんですね。困りました。
仰るように
check_ajax_referer
の第一引数に$action . $id
のように id を含ませるとなると、そこでチェックするidごとの個別のnonceはどうやって発行すればいいのでしょうか?質問のコードやネットの情報ですと、nonceは「ページに1つ」が発行されるだけで、「ボタンごとに」というのが難しく感じます。
フォーラム: 使い方全般
返信が含まれるトピック: 「nonce」の使い方についてなるほど。分けるべき適切な根拠がわかるまで、いろいろな事例で経験を積んでみたいと思います。とりあえずケースバイケースということですよね。笑
すみません夜分に。どうもありがとうございました!!フォーラム: 使い方全般
返信が含まれるトピック: 「nonce」の使い方についてあーっと…、すみません、ややこしくなるので、この疑問だけでいいです。
同じアクションの中で条件分岐すればいいだけなのに、nonceを複数作る(アクションを複数作る)ケースがあるのはなぜか?
これについて、どう思われますでしょうか?