我需要使用NONCE吗?

时间:2013-09-18 作者:David Garcia

我正在用ajax、jquery和php创建一个访问/页面视图计数器,我已经阅读了一些文章,建议通过ajax使用nonces进行数据操作,但是我不确定是否需要将nonces用于我的简单计数器?

我的代码看起来有点像这样;

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中有两个单独的请求,它们返回的变量一个为false,一个为true)此外,如果我想实现nonces,我该如何实现呢?

1 个回复
最合适的回答,由SO网友:brasofilo 整理而成

我认为“需要”意味着“没有它就不能工作”。它会起作用,但问题是安全性和最佳实践。即使这似乎不是必要的,但最好是稳妥行事,并始终这样做。

您必须像bellow一样将JavaScript排队,用wp_localize_script.

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就像bellow一样,使用对象名访问传递的值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 或复杂对象)。

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

结束

相关推荐

如何在Single.php中向侧边栏添加/插入类?

我有一个侧边栏显示在主页和单页上。当它显示在主页上时,它已经定义了一个css类(宽度:30%)当它显示在单个页面中时,我想向侧边栏添加/插入一个新类。我希望这种新样式可以修改预先定义的元素。所以它以35%的宽度结束我试着做如下:In functions.php (child theme)function sidebar_class() { if ( is_single() ) { $class = \'sidebar-single\'; }