Ce este nonce și cum să îl folosești cu Ajax în WordPress?

8 iul. 2016, 18:42:19
Vizualizări: 46.2K
Voturi: 9

Încerc să învăț cum să folosesc Ajax în WordPress în mod corect. Iată ce am învățat până acum:

Pasul 1: Creează fișierul Ajax și înregistrează-l folosind 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' );

Pasul 2: Folosește ajax astfel în ajxfile.js:

$( document ).ready(function() {

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

});

PASUL 3: adăugarea HTML în pagină:

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

De fiecare dată când cineva face click pe link, se afișează cu succes mesajul "Funcționează". Acum vreau să preiau acele date și să le adaug în meta-datele utilizatorului. Dar mă confuzează. Și ce este acest lucru numit nonce? Poate cineva să mă îndrume în direcția corectă?

5
Comentarii

nonce este un identificator unic pe care ulterior îl poți valida cu php pentru a te asigura că este o cerere validă și sigură. Este generat de funcția wp_create_nonce() și verificat fie prin wp_verify_nonce(), fie cu parametrul $_GET, sau preferabil prin filter_input(INPUT_GET, '$nonce');

knif3r knif3r
8 iul. 2016 18:47:33

Dar de ce WordPress îl recomandă? Și cum ar trebui să îl folosesc cu ajax?

Ramesh Pardhi Ramesh Pardhi
8 iul. 2016 18:49:48

WordPress îl recomandă deoarece reprezintă cea mai bună metodă de a verifica dacă cererea ta provine de unde și în modul dorit. Pentru a-l folosi cu ajax - creezi nonce-ul într-un câmp input ascuns, de exemplu, și îl obții cu js pentru a-l trimite împreună cu restul datelor cererii, apoi folosești parametrul GET în php pentru a-l valida.

knif3r knif3r
8 iul. 2016 18:52:25

https://codex.wordpress.org/Function_Reference/check_ajax_referer Aici poți găsi câteva exemple bune despre cum și de ce să o folosești. :)

knif3r knif3r
8 iul. 2016 18:55:00

Se așteaptă să cercetezi, cel puțin pe site-ul nostru, înainte să pui o întrebare. Am acoperit acest subiect de atâtea ori.

fuxia fuxia
8 iul. 2016 20:47:49
Toate răspunsurile la întrebare 1
7
42

Acum am înțeles! WordPress este pur și simplu minunat. De asemenea, mulțumesc knif3r, sugestiile tale m-au ajutat foarte mult. Încerc să explic în cuvintele mele. Te rog să mă corectezi dacă greșesc.

Ce este un nonce?

Nonce este ceva similar cu un hash de securitate pentru a preveni atacurile și greșelile. Acesta creează identificatori unici pentru a verifica dacă cererea ajax vine de pe site sau nu. În termeni WordPress:

Un nonce este un "număr folosit o singură dată" pentru a proteja URL-urile și formularele de anumite tipuri de utilizare greșită, malicioasă sau altfel. Nonce-urile WordPress nu sunt numere, ci un hash format din numere și litere. De asemenea, nu sunt folosite o singură dată, ci au o "durată de viață" limitată după care expiră.

Cum se folosește?

  1. Mai întâi trebuie să adăugăm fișierul js corect folosind wp_enqueue_script(). Ceva de genul:

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

Înregistrăm fișierul nostru ajxfile.js cu numele script-name. Acum se încarcă pe toate paginile WordPress.

  1. Acum trebuie să folosim wp_localize_script() pentru a declara variabilele și aici adăugăm nonce-ul pentru a-l folosi în funcții.

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

Am înregistrat și localizat cu succes scriptul nostru.

  1. Asigură-te să transmiți datele nonce în apelul tău ajax din ajxfile.js:

     /* global ajax_var */
     $.ajax( {
         url: ajax_var.url,
         type: 'post',
         data: {
             action: 'custom_script_name',
             nonce: ajax_var.nonce,   // transmitem nonce aici
             moredata: 'whatever',
         },
         success( data ) {
             if ( data ) {
                 // etc...
             }
         },
     } );
    
  1. Acum vrem să legăm funcția noastră de script. Am folosit:

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

Folosim wp_ajax_nopriv_ și wp_ajax_ pentru a lega funcțiile noastre de cârligele WordPress. Al doilea cârlig se declanșează când un utilizator este autentificat, iar primul când nu este.

  1. Funcția noastră va arăta astfel:

     function custom_php_ajax_function() {
         // Verificăm securitatea nonce      
         if ( ! wp_verify_nonce( $_POST['nonce'], 'ajax-nonce' ) ) {
             die ( 'Busted!');
         }
     }
    

Funcția noastră va verifica dacă datele ajax trimit datele nonce ascunse cu alți parametri. Dacă nu, va afișa o eroare. Acest lucru poate ajuta cu adevărat la prevenirea atacurilor ajax. Datele Nonce sunt o valoare ascunsă și trebuie trimise obligatoriu cu alți parametri.

Cum verificăm dacă funcționează?

  • Elimină 'nonce' => wp_create_nonce('ajax-nonce') din wpdocs_theme_name_scripts() și dă click pe link. Va afișa o eroare.
  • Acum elimină verificarea de securitate din funcția noastră și dă click pe link. Va funcționa.

Aceasta arată că funcția noastră cu verificarea de securitate nonce nu va funcționa niciodată dacă nu există date nonce. Este ascuns, așa că nimeni altcineva nu îl poate folosi. Și dacă nimeni nu îl cunoaște, atunci indiferent de câte ori rulează acel ajax, funcția noastră nu le va răspunde.

Îmi cer scuze pentru engleza mea slabă și explicația neclară. Încerc doar să ajut. Te rog să-mi spui dacă am omis ceva sau am făcut ceva greșit.

8 iul. 2016 20:06:50
Comentarii

Un mic detaliu: wp_ajax_nopriv_ este pentru utilizatorii care NU sunt autentificați (ei "nu au privilegii"), iar wp_ajax_ este pentru utilizatorii care sunt autentificați. Tu ai menționat invers.

scott scott
8 iul. 2016 21:02:02

Se pare că ai înțeles corect :) Doar nu uita să folosești opțiunile de filtrare când utilizezi cereri POST/GET/REQUEST precum filter_input(INPUT_POST 'datasource'); sau alte funcții PHP cum ar fi htmlspecialchars() și esc_attr() sau esc_html când folosești câmpuri ascunse pentru a transmite date către js și vei fi pe drumul cel bun.

knif3r knif3r
8 iul. 2016 21:29:01

Mulțumesc Scott, am actualizat răspunsul. Da knif3r, mulțumesc pentru sugestie. O voi ține minte.

Ramesh Pardhi Ramesh Pardhi
9 iul. 2016 10:36:15

răspuns bun. Am adăugat doar pasul în care datele nonce trebuie transmise în apelul $.ajax

squarecandy squarecandy
28 ian. 2021 01:48:45

Foarte bine explicat - mulțumesc

Clinton Clinton
15 mar. 2021 17:06:12

Aceasta ajută foarte mult, dar nu înțeleg de ce primesc întotdeauna 0 în corpul răspunsului.

noob noob
1 nov. 2022 12:55:43

Explicație clară @RameshPardhi

Krupal Panchal Krupal Panchal
1 dec. 2022 11:37:50
Arată celelalte 2 comentarii