WordPress check_ajax_referer在使用AJAX内部操作时禁止403

时间:2017-11-13 13:32:37

标签: jquery ajax wordpress nonce

我在WordPress中进行AJAX调用以连接API。为此,我试图使用一个随机数,以防止任何未经授权或机器人访问。这是我的代码:

的functions.php

add_action('wp_enqueue_scripts', 'yrc_cst_ajax_platform_script_enqueue');

function yrc_cst_ajax_platform_script_enqueue () {
    wp_enqueue_script(
        'platform',
        get_template_directory_uri(). '/includes/platform.js',
        array('jquery'), '1.0', true);

    wp_localize_script('platform', 'yrc_cst_platform', array(
        'ajax_url' => admin_url('admin-ajax.php'),
        'ajax_nonce' => wp_create_nonce('platform_security')
    ));
}

add_action('wp_ajax_save_platform_contact', 'yrc_cst_save_platform_contact');

在AJAX动作方法中,我写了这个(functions.php):

function yrc_cst_save_platform_contact() {
   if ( check_ajax_referer( 'platform_security', $_POST['security'] ) ) {
      var_dump($_POST['security']);
   }
   ...
}

这是AJAX电话:

jQuery.ajax({
   url: yrc_cst_platform.ajax_url,
   type: 'post',
   data: {
      action: 'save_platform_contact',
      security: yrc_cst_platform.ajax_nonce,
      contact_email: client_email
   },
   success: function(response) {
      // Doing my stuff...
   }
});

在控制台中我看到了这个

  

无法加载资源。服务器响应状态代码:403   (禁止)/wp-admin/admin-ajax.php

如果我删除了阻止check_ajax_referer(...),那么一切正常。一切都在我的本地。我只是以登录用户身份测试周期。

我不知道如何解决它。

2 个答案:

答案 0 :(得分:1)

check_ajax_referer的第二个参数用于指定在$ _REQUEST中查找nonce的位置。当你调用check_ajax_referer('platform_security',$ _POST ['security'])时,你基本上告诉函数检查$ _REQUEST [$ _ POST ['security']]。

您应该像这样使用它:

check_ajax_referer( 'platform_security', 'security' )

您可以在此处详细了解:https://codex.wordpress.org/Function_Reference/check_ajax_referer

答案 1 :(得分:0)

尝试使用wp_verify_nonce而不是check_ajax_referer,如下所示:

function yrc_cst_save_platform_contact() {
if ( wp_verify_nonce( $_POST['security'], 'platform_security' ) ) {
  var_dump($_POST['security']);
}
 ...
}