web-dev-qa-db-fra.com

Dois-je utiliser du nonce?

Je crée un compteur de visites/pages avec ajax, jquery et php, j’ai lu quelques articles qui recommandent l’utilisation de nonces pour la manipulation de données via ajax, mais je ne suis pas sûr si j’ai besoin d’intégrer l’utilisation de nonces pour mon compteur simple?

mon code ressemble un peu à ceci;

jquery

jQuery.ajax({
        type: 'POST',
        url: ajaxurl,
        data: {action: 'countHits', status: 'true'},
        });

php

//ajax functions
add_action('wp_ajax_countHits', 'countHits');
add_action('wp_ajax_nopriv_countHits', 'countHits');
function countHits() {

    if($_POST['status'] != "") {
       $status= $_POST['status'];

    if(!isset($_COOKIE['UNIQUEUSER'] && $status == 'true'){
       $uniqueUser= get_option('stats');
       $uniqueUser['uniqueUser']+=1;
       update_option('stats', $uniqueUser);
    }
die(); 
}

Donc, comme vous pouvez le constater, c’est très simple, dois-je utiliser des nonces pour chaque requête ajax? (J’ai deux requêtes distinctes dans mon jquery qui renvoient les variables une pour fausse pour vrai) en outre, si je voulais implémenter des nonces, comment je vais faire ça?

4
David Garcia

Je pense que requis voudrait dire que "ça ne marche pas sans ça". Cela fonctionnera, mais la question est celle de la sécurité et des meilleures pratiques. Même si cela ne semble pas nécessaire, il est préférable de jouer avec prudence et de le faire toujours.

Vous devez mettre votre JavaScript en file d'attente comme ci-dessous, en passant PHP valeurs (comme l'URL d'administrateur Ajax et le nonce) avec wp_localize_script .

function enqueue_wpse_114600() 
{
    wp_register_script( 
         'my-ajax' // Handle
        , get_template_directory_uri() . '/js/ajax.js'
        , array( 'jquery' ) 
    );   
    wp_enqueue_script( 'my-ajax' );    
    wp_localize_script( 
         'my-ajax', // Handle
         'my_ajax', // Object name
         array( 
             'ajaxurl'     => admin_url( 'admin-ajax.php' ),
             'ajaxnonce'   => wp_create_nonce( 'ajax_validation' ) 
        ) 
    );
}

Le JS serait comme ci-dessous, accédant aux valeurs transmises avec le nom d'objet, dans ce cas my_ajax.any_value_you_passed.

jQuery( document ).ready( function( $ ) 
{ 
     var data = {
         action: 'countHits',
         security: my_ajax.ajaxnonce
     };   
     $.post( 
         my_ajax.ajaxurl, 
         data,                   
        function( response ) {
            if( !response.success )
            {
                // No data came back, maybe a security error
                if( !response.data ) console.log( 'AJAX ERROR: no response' );
                else console.dir( response.data.error );
            }
            else console.dir( response.data );
        }
     ); 
});

Et dans votre action Ajax, recherchez le nonce avec check_ajax_referer et utilisez les fonctions wp_send_json_* qui renvoient le résultat (soit un simple true ou complexe objets).

function countHits()
{
    check_ajax_referer( 'ajax_validation', 'security' );
    $ok = something();
    if( !ok )
        wp_send_json_error( array( 'error' => __( 'Not ok.' ) ) );
    else
        wp_send_json_success( $ok );
}
5
brasofilo