AJAX nonce con check_ajax_referer()

7 dic 2015, 12:08:07
Visualizzazioni: 19.7K
Voti: 6

Voglio utilizzare check_ajax_referer() per verificare un campo WP_nonce usando AJAX. Ecco il mio elemento html:

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

Utilizzando jQuery sto inviando tutti i valori dai campi input tramite una richiesta 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'
});

In handle-login.php sto provando a fare questo:

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

Ma in risposta non ottengo nulla... Qualcuno sa cosa c'è che non va?

0
Tutte le risposte alla domanda 3
0

Difficile dire con certezza dove sia l'errore poiché non hai menzionato il tuo add_action('wp_ajax_my_function','whatever_callback'); che penso tu abbia dimenticato. Ma la tua domanda manca di informazioni a riguardo.

Ecco come procederei:

Nel tuo file functions.php o simile:

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

Assicurati che il tuo file handle-login.php sia dichiarato nel tuo file php principale del plugin o del tema come functions.php

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

Dovresti dichiarare le variabili nonce e l'url ajax subito dopo l'hook del tuo file js, potrai accedervi successivamente:

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')
) );

Nel tuo file handle-login.php:

function handle_login_ajax(){
    check_ajax_referer('handle_login', 'security');
    $return = array();
    echo $return;
    wp_die(); // Hai dimenticato anche questo
}

Il tuo file Javascript:

function send_stuff_to_server(){

var data = {
    'action': 'handle_login', // mancava questo, uguale al tuo action hook wp_ajax_{handle_login}
    'security': MyAjax.security // Possiamo accedervi in questo modo
}

$.post(MyAjax.ajax_url, data, function (callBack) {
      console.log(callBack); // Restituirà il nonce
});

}

Spero sia d'aiuto.

5 mar 2016 22:35:58
0

Ho avuto gli stessi problemi e li ho risolti utilizzando un'altra funzione ajax correlata: Basta cambiare il tuo

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

con

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

sembra funzionare e restituire true/false correttamente. Riguardo al fatto che sia più sicuro un modo o l'altro ho trovato questa informazione:

wp_verify_nonce vs check_admin_referer

9 mar 2017 11:58:07
0

Nel metodo check_ajax_referer(), il secondo parametro non è il valore del nonce, ma la chiave del parametro nella richiesta POST.

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

18 giu 2020 18:52:46