web-dev-qa-db-fra.com

AJAX nonce avec check_ajax_referer ()

Je souhaite utiliser check_ajax_referer () pour vérifier un champ WP_nonce avec AJAX. Ici vous pouvez trouver mon élément html.

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

Avec jQuery, j'envoie toutes les valeurs des champs de saisie à une requête 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'
});

Dans handle-login.php, j'essaie de faire ce qui suit:

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

Mais en retour je n’aurai rien .. Quelqu'un sait ce qui se passe?

3
ronnyrr

Difficile de dire avec certitude où est l'erreur, car vous n'avez pas mentionné votre add_action('wp_ajax_my_function','whatever_callback');qui je pense que vous avez manqué cela. Mais votre question manque d'informations à cet égard.

Voici comment je voudrais en venir à ce sujet:

Dans votre fichier functions.php ou similaire:

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

Assurez-vous que votre fichier handle-login.php est déclaré sur votre fichier php principal à partir de votre plugin ou de votre thème, tel que functions.php.

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

Vous devez déclarer les variables nonce et l'URL ajax juste après le hook de votre fichier js. Vous pourrez y accéder après:

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

Dans votre fichier handle-login.php:

function handle_login_ajax(){
    check_ajax_referer('login_nonce', 'security');
    $return = array();
    echo $return;
    wp_die(); // You missed this too
}

Votre fichier Javascript:

function send_stuff_to_server(){

var data = {
    'action': 'handle_login', // missed this same as your action hook wp_ajax_{handle_login}
    'security': MyAjax.security // We can access it this way
}

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

}

J'espère que cela t'aides.

5
db306

J’ai eu les mêmes problèmes et j’ai résolu en utilisant une autre fonction ajax associée: changer simplement votre

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

à

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

semble fonctionner et retourner vrai/faux correctement. Pour savoir si c'est plus sécurisé d'une manière ou d'une autre, j'ai trouvé cette information:

wp_verify_nonce vs check_admin_referer

1
gtamborero