Verificarea nonce-ului AJAX cu check_ajax_referer() în WordPress

7 dec. 2015, 12:08:07
Vizualizări: 19.7K
Voturi: 6

Vreau să folosesc check_ajax_referer() pentru a verifica un câmp WP_nonce folosind AJAX. Aici puteți găsi elementul meu HTML.

<input type="hidden" name="login_nonce" value="<?= wp_create_nonce('login_nonce'); ?>"/>

Folosind jQuery, trimit toate valorile din câmpurile de input către o cerere POST:

request = $.ajax({
  type: 'POST',
  url: 'handle-login.php',
  data: {
    user: $('input[name="login_username"]').val(),
    pass: $('input[name="login_password"]').val(),
    security: $('input[name="login_nonce"]').val()
  },
  dataType: 'json'
});

În handle-login.php încerc să fac următoarele:

require_once $_SERVER['DOCUMENT_ROOT'].'/wp-load.php';

$return = array();
if( check_ajax_referer( 'login_nonce', $_POST['security'], false ) )
    $return['nonce'] = $_POST['login_nonce'];

echo $return

Dar în return nu primesc nimic... Știe cineva care este problema?

0
Toate răspunsurile la întrebare 3
0

Este dificil să spun exact unde este greșeala, deoarece nu ai menționat despre add_action('wp_ajax_my_function','whatever_callback');, ceea ce cred că ai omis. Dar întrebarea ta nu conține informații în acest sens.

Aș proceda astfel:

În fișierul tău functions.php sau similar:

add_action(wp_ajax_handle_login, 'handle_login_ajax');
add_action(wp_ajax_nopriv_handle_login, 'handle_login_ajax');

Asigură-te că fișierul tău handle-login.php este declarat în fișierul principal PHP din pluginul sau tema ta, cum ar fi functions.php

require_once plugin_dir_path(__FILE__) . 'handle-login.php';

Ar trebui să declari variabilele nonce și URL-ul AJAX imediat după încărcarea fișierului JS, vei putea accesa acestea după:

wp_enqueue_script('wccajs',plugin_dir_url( dirname(__FILE__) ) . 'login.js',array('jquery'),'1.0',false);

wp_localize_script('wccajs','MyAjax',array( 
    'ajax_url' => admin_url( 'admin-ajax.php' ),
    'security' => wp_create_nonce('handle_login')
) );

În fișierul tău handle-login.php:

function handle_login_ajax(){
    check_ajax_referer('handle_login', 'security');
    $return = array();
    echo $return;
    wp_die(); // Ai omis și asta
}

Fișierul tău Javascript:

function send_stuff_to_server(){

var data = {
    'action': 'handle_login', // ai omis același lucru ca și în acțiunea ta wp_ajax_{handle_login}
    'security': MyAjax.security // Putem accesa astfel
}

$.post(MyAjax.ajax_url, data, function (callBack) {
      console.log(callBack); // Va returna nonce
});

}

Sper că acest lucru te ajută.

5 mar. 2016 22:35:58
0

Am avut aceleași probleme și le-am rezolvat folosind o altă funcție Ajax înrudită: Doar schimbând

check_ajax_referer( 'login_nonce', $_POST['security'], false )

în

wp_verify_nonce( $_POST['security'], 'login_nonce' )

pare să funcționeze și să returneze true / false corect. În ceea ce privește dacă este mai sigură o metodă sau alta, am găsit aceste informații:

wp_verify_nonce vs check_admin_referer

9 mar. 2017 11:58:07
0

În metoda check_ajax_referer(), al doilea parametru nu este valoarea nonce, ci cheia parametrului din cererea POST.

check_ajax_referer( 'login_nonce', 'security', false );

18 iun. 2020 18:52:46