フォーラムへの返信

15件の返信を表示中 - 1 - 15件目 (全18件中)
  • フォーラム: 使い方全般
    返信が含まれるトピック: 「nonce」の使い方について

    @ishitakaさん

    なー…る、ほど。上のユーザーループならばできそうな予感がします。

    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」の使い方について

    @ishitakaさん

    迅速なご返信に心より感謝申し上げます。
    なるほどグローバル変数にするんですね。
    (こちらはスマートさを判断できるレベルではないので気にしないでください。笑)

    ただ「このユーザーを許可」のボタンはユーザー一覧ページに出てくるボタンで、その$target_idget_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」の使い方について

    @ishitakaさん

    $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」の使い方について

    @du-bist-der-lenzさん

    こんばんは。どこまでが変数名なのかを明示的に示すとは、なるほどよく考えられてますね。ありがとうございます。

    フォーラム: 使い方全般
    返信が含まれるトピック: 「nonce」の使い方について

    @ishitakaさん

    最後に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」の使い方について

    @ishitakaさん

    なるほどこのようにチェックできるんですね。

    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) ) {

    の部分はどのように書き換えるべきか?

    ということについてお教えて頂けますとうれしいです。

    • この返信は11ヶ月、 1週前に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を複数作る(アクションを複数作る)ケースがあるのはなぜか?

    これについて、どう思われますでしょうか?

15件の返信を表示中 - 1 - 15件目 (全18件中)