it-swarm.com.de

Benötige ich die Verwendung von Nonce?

Ich erstelle einen Besuchs-/Seitenaufrufzähler mit Ajax, JQuery und PHP. Ich habe ein paar Artikel gelesen, in denen die Verwendung von Nonces zur Datenmanipulation über Ajax empfohlen wird. Ich bin mir jedoch nicht sicher, ob ich die Verwendung von Nonces für meine Website integrieren muss einfacher Zähler?

mein Code sieht ungefähr so ​​aus.

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

Wie Sie sehen, ist es sehr einfach, Nonces für jede Ajax-Anfrage zu verwenden (ich habe zwei separate Anfragen in meiner Abfrage, die eine Variable für eine falsche für eine wahre zurückgeben) mache ich das?

4
David Garcia

Ich denke erforderlich würde bedeuten, dass "es nicht ohne es funktioniert". Es wird funktionieren, aber es geht um Sicherheit und Best Practices. Auch wenn es nicht notwendig erscheint , ist es besser, auf der sicheren Seite zu spielen und es immer zu tun.

Sie müssen Ihr JavaScript wie unten in eine Warteschlange stellen und PHP Werte (wie die Ajax-URL des Administrators und die Nonce) mit wp_localize_script übergeben.

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

Das JS würde wie unten dargestellt auf die übergebenen Werte mit dem Objektnamen zugreifen, in diesem Fall 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 );
        }
     ); 
});

Und in Ihrer Ajax-Aktion suchen Sie mit check_ajax_referer nach der Nonce und verwenden Sie die Funktionen wp_send_json_* das, um das Ergebnis zurückzusenden (sei eine einfache true oder ein komplexes Objekt).

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