web-dev-qa-db-fra.com

Qu'est-ce que le nonce et comment l'utiliser avec Ajax dans WordPress?

J'essaie d'apprendre comment utiliser Ajax dans WordPress de manière appropriée. C'est ce que j'ai appris:

Étape 1: Créez un fichier Ajax et enregistrez-le en utilisant wp_enqueue_script.

function wpdocs_theme_name_scripts() {
    wp_enqueue_script( 'script-name', get_stylesheet_directory_uri() . '/js/ajxfile.js', array(), '1.0.0', true );
}
add_action( 'wp_enqueue_scripts', 'wpdocs_theme_name_scripts' );

Étape 2: Utilisez ajax comme ceci dans ajxfile.js:

$( document ).ready(function() {

$('#id').on('click',function (e){       
    alert("Its Working");
    var up = 1;
    var id = $( "#id" ).data( "user_id" );
    $.ajax({
            type: "POST",
                url: "runcode.php",
                data: {up:up, id:id},
                success:
                    function(result){
                alert("result");
                        }
        });
});

});

ÉTAPE 3: ajouter du HTML dans la page:

  <a href="#" id="id" data-user_id="<?php echo $user_id = get_current_user_id(); ?>" 
  data-post_id="<?php echo $post_id = get_the_ID(); ?>">
         <i class="fa fa-thumbs-up" aria-hidden="true"></i>
  </a>

Chaque fois que quelqu'un clique sur le lien, sa déclaration d'alerte "Son fonctionnement" est réussie. Maintenant, je veux récupérer ces données et je veux les ajouter dans les méta utilisateurs. Mais sa me confondre. Et quelle est cette chose nonce? Quelqu'un peut-il me guider dans la bonne direction?

1
Ramesh Pardhi

Maintenant j'ai compris! WordPress est tout simplement génial. Merci aussi knif3r, vos suggestions m'aident beaucoup. J'essaie de l'expliquer avec mes mots. S'il vous plait corrigez moi si je me trompe.

Qu'est-ce que le nonce?

Le nonce est quelque chose comme un hachage de sécurité pour prévenir les attaques et les erreurs. Il crée des identifiants uniques pour vérifier si la demande ajax provient d'un site Web ou non. Dans WordPress mots

Un nonce est un "numéro utilisé une seule fois" destiné à protéger les URL et les formulaires de certains types d'utilisation abusive, malveillants ou autres. WordPress les nonces ne sont pas des chiffres, mais sont un hachage composé de chiffres et de lettres. Ils ne sont pas non plus utilisés qu'une seule fois, mais ont une "durée de vie" limitée après laquelle ils expirent.

Comment l'utiliser?

  1. Nous devons d’abord ajouter notre fichier js correctement en utilisant wp_enqueue_script(). Quelque chose comme ça:

    function wpdocs_theme_name_scripts() {
        wp_enqueue_script( 'script-name', get_stylesheet_directory_uri().
            '/js/ajxfile.js', array(), '1.0.0', true );
    }
    add_action( 'wp_enqueue_scripts', 'wpdocs_theme_name_scripts' );
    

Nous enregistrons notre fichier ajxfile.js sous le nom script-name. Maintenant son chargement sur toutes les pages de notre wordpress.

  1. Maintenant, nous devons utiliser wp_localize_script() pour déclarer nos variables et nous ajoutons ici notre nonce pour l'utiliser dans des fonctions.

    function wpdocs_theme_name_scripts() {
        wp_enqueue_script( 'script-name', get_stylesheet_directory_uri() . 
            '/js/ajxfile.js', array(), '1.0.0', true );
        wp_localize_script('script-name', 'ajax_var', array(
            'url' => admin_url('admin-ajax.php'),
            'nonce' => wp_create_nonce('ajax-nonce')
        ));
    }
    

Nous enregistrons et localisons notre script avec succès.

  1. Maintenant, nous voulons lier notre fonction avec notre script. Alors j'ai utilisé ça

    add_action('wp_ajax_nopriv_script-name', 'script_name');    
    add_action('wp_ajax_script-name', 'script_name');
    

Nous utilisons wp_ajax_nopriv_ & wp_ajax_ pour lier nos fonctions avec des hooks wordpress. Le deuxième point est activé lorsqu'un utilisateur est connecté et le premier lorsqu'il ne l'est pas.

  1. Notre fonction est sera comme ça

    function script_name() {
        // Check for nonce security
        $nonce = $_POST['nonce'];
    
        if ( ! wp_verify_nonce( $nonce, 'ajax-nonce' ) )
            die ( 'Busted!');
    }
    

Notre fonction vérifiera si les données ajax envoient nonce données cachées avec d'autres paramètres. Si ce n'est pas le cas, une erreur sera générée. Cela peut vraiment aider à prévenir les attaques ajax. Nonce les données sont une valeur cachée et doivent obligatoirement être envoyées avec d'autres paramètres.

Comment vérifier si cela fonctionne ou pas?

  • Retirez 'nonce' => wp_create_nonce('ajax-nonce') de wpdocs_theme_name_scripts() et cliquez sur le lien. Cela montrera une erreur.
  • Maintenant, supprimez le contrôle de sécurité de notre fonction et cliquez sur le lien. Ça va marcher.

Cela montre que notre fonction de vérification de la sécurité de nonce ne fonctionnera jamais s'il n'y a pas de données de nonce. C'est caché pour que personne d'autre ne puisse l'utiliser. Et si personne ne le sait, alors peu importe le nombre de fois où ils exécutent cet ajax, notre fonction ne leur répondra pas.

Désolé pour mon anglais médiocre et ma mauvaise explication. J'essaye juste d'aider. Faites-moi savoir s'il me manque quelque chose ou si quelque chose ne va pas.

6
Ramesh Pardhi