web-dev-qa-db-ja.com

ajax nonceの検証に失敗しました

アーカイブテンプレートを使用して投稿のリストを印刷する投票システムがあります。各投稿の投票ボタンには、vote-idおよびvote-nonceを含むHTMLデータ属性があります。

投票ボタンがクリックされると、投票IDと投票ノンスを含むAJAX呼び出しが行われます。これらはサーバー側で検証されるべきですが、wp-verify-nonceに失敗しているように見えます。投稿されたデータをデバッグしてエコーすると、元のデータと同じであることが確認されます。

AJAX PHP機能:

function submit_vote() {
    $vote_id = intval($_POST['vote_id']);
    $vote_nonce = sanitize_text_field($_POST['vote_nonce']);
    $action = sanitize_text_field($_POST['vote_nonce']);

    if ( !wp_verify_nonce($vote_nonce,'vote-nonce-' . $vote_id))
        die(-1);

    $response = json_encode( array( 'success' => true ) );
    die($response);
}
add_action( 'wp_ajax_submit_vote', 'submit_vote' );

ノンジェネレーション:

wp_create_nonce( 'vote-nonce-' . get_the_ID() );

AJAX JavaScript呼び出し:

jQuery(document).ready(function(){
  jQuery(".post-voting").click(function(){
    vote_nonce = jQuery(this).data('vote-nonce');
    vote_id = jQuery(this).data('vote-id');

    jQuery.post(
      vote_ajax.url,
      {
        action: 'submit_vote',
        vote_id: vote_id,
        vote_nonce: vote_nonce
      },
      function( data ) {
        alert( jQuery.parseJSON(data) );
      }
    );
  });
});

Ajaxリクエストは空のレスポンスで死んでいるように見えます(-1ではありません)。

1
Stephen Mahood

Ajaxリクエストでナンスを検証するには、check_ajax_referrer()の代わりに wp_verify_nonce() を使用します。

ナンスを作成します。

$nonce = wp_create_nonce( 'vote-nonce-' . get_the_ID() );

JavaScriptでそれを含める:

jQuery(document).ready(function(){
  jQuery(".post-voting").click(function(){
    vote_nonce = <?php echo $nonce; ?>
    vote_id = jQuery(this).data('vote-id');

    jQuery.post(
      vote_ajax.url,
      {
        action: 'submit_vote',
        vote_id: vote_id,
        vote_nonce: vote_nonce
      },
      function( data ) {
        alert( jQuery.parseJSON(data) );
      }
    );
  });
});

Ajaxコールバックをチェックインしてください。

add_action( 'wp_ajax_submit_vote', 'submit_vote' );
function submit_vote() {

    $vote_id = intval( $_POST['vote_id'] );
    $vote_nonce_name = 'vote-nonce-' . $vote_id;

    // By default, check_ajax_referer dies if nonce can not been verified
    if( ! check_ajax_referer( $vote_nonce_name, 'vote_nonce', false ) ) {
        wp_send_json_error();
    } else {
        wp_send_json_success();
    }

}
1
cybmeta