Cos'è nonce e come utilizzarlo con Ajax in WordPress?

8 lug 2016, 18:42:19
Visualizzazioni: 46.2K
Voti: 9

Sto cercando di imparare come utilizzare Ajax in WordPress nel modo corretto. Questo è ciò che ho imparato:

Passo 1: Creare il file Ajax e registrarlo usando 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' );

Passo 2: Utilizzare ajax in questo modo nel file ajxfile.js:

$( document ).ready(function() {

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

});

PASSO 3: aggiungere HTML nella pagina:

  <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>

Ogni volta che qualcuno clicca sul link, viene visualizzato con successo l'alert "Funziona". Ora voglio recuperare quei dati e aggiungerli nei meta dell'utente. Ma mi sta confondendo. E cos'è questa cosa chiamata nonce? Qualcuno può guidarmi nella giusta direzione?

5
Commenti

nonce è un identificatore unico che successivamente puoi validare con php per assicurarti che sia una richiesta valida e pulita, viene generato dalla funzione wp_create_nonce() e verificato tramite wp_verify_nonce() oppure con il parametro $_GET, o il metodo preferito filter_input(INPUT_GET, '$nonce');

knif3r knif3r
8 lug 2016 18:47:33

Ma perché WordPress lo raccomanda? e come dovrei usarlo con ajax?

Ramesh Pardhi Ramesh Pardhi
8 lug 2016 18:49:48

WordPress lo raccomanda perché è un buono, anzi - il miglior modo per verificare se la tua richiesta proviene da dove vuoi e come vuoi. Per usarlo con ajax - crei il nonce in un campo input nascosto ad esempio e lo recuperi con js così puoi passarlo insieme agli altri dati della richiesta, poi usi il parametro GET in php per validarlo

knif3r knif3r
8 lug 2016 18:52:25

https://codex.wordpress.org/Function_Reference/check_ajax_referer Qui puoi trovare alcuni buoni esempi su come e perché utilizzarlo. :)

knif3r knif3r
8 lug 2016 18:55:00

Ci si aspetta che tu faccia delle ricerche, almeno sul nostro sito, prima di fare una domanda. Abbiamo trattato questo argomento così tante volte.

fuxia fuxia
8 lug 2016 20:47:49
Tutte le risposte alla domanda 1
7
42

Ora ho capito! WordPress è semplicemente fantastico. Grazie anche a te knif3r, i tuoi suggerimenti mi hanno aiutato molto. Proverò a spiegarlo con le mie parole. Per favore, correggimi se sbaglio.

Cos'è un nonce?

Un nonce è qualcosa simile a un hash di sicurezza per prevenire attacchi ed errori. Crea identificatori unici per verificare se la richiesta ajax proviene dal sito web o meno. Nelle parole di WordPress:

Un nonce è un "numero usato una volta" per proteggere URL e form da alcuni tipi di abuso, sia maliziosi che no. I nonce di WordPress non sono numeri, ma sono un hash composto da numeri e lettere. Inoltre, non vengono usati una sola volta, ma hanno un "tempo di vita" limitato, dopo il quale scadono.

Come si usa?

  1. Per prima cosa dobbiamo aggiungere il nostro file js correttamente usando wp_enqueue_script(). Qualcosa del genere:

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

Registriamo il nostro file ajxfile.js con il nome script-name. Ora viene caricato su tutte le pagine del nostro WordPress.

  1. Ora dobbiamo usare wp_localize_script() per dichiarare le nostre variabili e qui aggiungiamo il nostro nonce da usare nelle funzioni.

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

Abbiamo registrato e localizzato con successo il nostro script.

  1. Assicurati di passare i dati del nonce nella tua chiamata ajax in ajxfile.js:

     /* global ajax_var */
     $.ajax( {
         url: ajax_var.url,
         type: 'post',
         data: {
             action: 'custom_script_name',
             nonce: ajax_var.nonce,   // passa il nonce qui
             moredata: 'whatever',
         },
         success( data ) {
             if ( data ) {
                 // etc...
             }
         },
     } );
    
  1. Ora vogliamo collegare la nostra funzione con il nostro script. Quindi ho usato questo:

     add_action('wp_ajax_nopriv_custom_script_name', 'custom_php_ajax_function');    
     add_action('wp_ajax_custom_script_name', 'custom_php_ajax_function');
    

Stiamo usando wp_ajax_nopriv_ e wp_ajax_ per collegare le nostre funzioni agli hook di WordPress. Il secondo hook viene attivato quando un utente è loggato e il primo quando non lo è.

  1. La nostra funzione sarà così:

     function custom_php_ajax_function() {
         // Controlla la sicurezza del nonce      
         if ( ! wp_verify_nonce( $_POST['nonce'], 'ajax-nonce' ) ) {
             die ( 'Busted!');
         }
     }
    

La nostra funzione controllerà se i dati ajax stanno inviando il dato nascosto nonce con gli altri parametri. Se non lo fa, genererà un errore. Questo può davvero aiutare a prevenire attacchi ajax. Il dato Nonce è un valore nascosto e deve essere inviato con gli altri parametri.

Come verificare se funziona o meno?

  • Rimuovi 'nonce' => wp_create_nonce('ajax-nonce') da wpdocs_theme_name_scripts() e clicca sul link. Mostrerà un errore.
  • Ora rimuovi il controllo di sicurezza dalla nostra funzione e clicca sul link. Funzionerà.

Questo dimostra che la nostra funzione con il controllo di sicurezza del nonce non funzionerà mai se non ci sono dati nonce. È nascosto, quindi nessun altro può usarlo. E se nessuno lo conosce, non importa quante volte eseguano quell'ajax, la nostra funzione non risponderà.

Scusate per il mio inglese approssimativo e la spiegazione poco chiara. Sto solo cercando di aiutare. Fatemi sapere se manca qualcosa o se ho fatto qualcosa di sbagliato.

8 lug 2016 20:06:50
Commenti

Una piccola cosa: wp_ajax_nopriv_ è per gli utenti che NON hanno effettuato l'accesso (non hanno "privilegi"), mentre wp_ajax_ è per gli utenti che hanno effettuato l'accesso. Tu l'hai indicato al contrario.

scott scott
8 lug 2016 21:02:02

Sembra che tu abbia capito bene :) Ricorda solo di usare le opzioni di filtraggio quando usi richieste POST/GET/REQUEST come filter_input(INPUT_POST 'datasource'); o altre funzioni PHP come htmlspecialchars(), esc_attr() o esc_html quando usi campi nascosti per passare dati a JS e sarai a posto.

knif3r knif3r
8 lug 2016 21:29:01

Grazie Scott, ho aggiornato la risposta. Sì knif3r, grazie per il suggerimento. Me lo ricorderò.

Ramesh Pardhi Ramesh Pardhi
9 lug 2016 10:36:15

ottima risposta. Ho solo aggiunto il passaggio in cui i dati del nonce devono essere passati nella chiamata $.ajax

squarecandy squarecandy
28 gen 2021 01:48:45

Molto ben spiegato - grazie

Clinton Clinton
15 mar 2021 17:06:12

Questo aiuta molto ma non capisco perché ottengo sempre 0 nel corpo della risposta.

noob noob
1 nov 2022 12:55:43

Ben spiegato @RameshPardhi

Krupal Panchal Krupal Panchal
1 dic 2022 11:37:50
Mostra i restanti 2 commenti