Cos'è nonce e come utilizzarlo con Ajax in WordPress?
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?

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?
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.
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.
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... } }, } );
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 è.
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')
dawpdocs_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.

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.

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.

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

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

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