web-dev-qa-db-ja.com

Nonceの使用が必要ですか?

Ajax、jquery、phpを使ってvisit/page viewsカウンタを作成しています。私は、ajaxによるデータ操作にnonceの使用を推奨する記事をいくつか読んでいますが、nonceの使用を統合する必要があるかどうかわかりません。簡単なカウンター?

私のコードはこのように見えます。

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

非常に単純なので、ajaxリクエストごとにnonceを使用する必要がありますか(私のjqueryには、true用にfalse用に1つを返す2つの別々のリクエストがあります)。私はそれをしに行きますか?

4
David Garcia

requiredは「それなしでは動作しません」という意味です。それはうまくいくでしょうが、問題はセキュリティとベストプラクティスです。たとえ必要ではないとしても、安全な側でプレーして常にそれを実行することをお勧めします。

PHPの値(admin Ajax URLやnonceなど)を wp_localize_script で渡して、次のようにJavaScriptをエンキューする必要があります。

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

JSは次のようになります。オブジェクト名、この場合は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 );
        }
     ); 
});

そしてあなたのAjaxアクションで、 check_ajax_referer でナンスをチェックし、結果を返送するための関数 wp_send_json_* を使用してください(単純なtrueまたはcomplex)オブジェクト)。

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