AJAX随机数验证失败

时间:2016-06-26 作者:Stephen Mahood

我有一个投票系统,其中一个帖子列表是使用存档模板打印出来的。每个帖子的投票按钮都有html数据属性,其中包含vote-id 以及vote-nonce.

单击投票按钮时,将发出一个AJAX调用,其中包含投票id和投票nonce。这些应该在服务器端进行验证,但它们似乎失败了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 个回复
最合适的回答,由SO网友:cybmeta 整理而成

要验证Ajax请求中的nonce,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();
    }

}

相关推荐

尝试在WordPress中实现AJAX注释,遇到WP错误

我试图在WordPress中为我的评论实现Ajax,使用this tutorial. 但我在将教程中的代码集成到自己的预构建主题时遇到了问题。问题是,我要么得到一个WP错误“检测到重复注释;看来你已经说过了!”或标准500错误。以下是我得到的:下面是我对ajax的评论。js文件如下所示: * Let\'s begin with validation functions */ jQuery.extend(jQuery.fn, { /* * check i