【问题标题】:How does check_ajax_referer() really work?check_ajax_referer() 究竟是如何工作的?
【发布时间】:2012-06-08 03:05:20
【问题描述】:

Smart Wordpress people say 插件开发人员应该在从页面发送回 wordpress 博客 (admin-ajax.php) 的每个 AJAX 请求中使用随机数。

这是通过 (1) 在服务器端生成一个随机数,通过

$nonce = wp_create_nonce  ('my-nonce');

...(2) 使该 nonce 可用于发送 AJAX 请求的 Javascript 代码。例如,您可以这样做:

function myplg_emit_scriptblock() {
    $nonce = wp_create_nonce('myplg-nonce');
    echo "<script type='text/javascript'>\n" .
        " var WpPlgSettings = {\n" .
        "   ajaxurl : '" . admin_url( 'admin-ajax.php' ) . "',\n" .
        "   nonce : '" . $nonce . "'\n" .
        " };\n" .
        "</script>\n";
}
add_action('wp_print_scripts','myplg_emit_scriptblock');

...然后 (3) javascript ajax 逻辑引用该全局变量。

    var url = WpPlgSettings.ajaxurl +
        "?action=my-wp-plg-action&" +
        "nonce=" + WpPlgSettings .nonce +
        "docid=" + id;

    $.ajax({type: "GET",
            url: url,
            headers : { "Accept" : 'application/json' },
            dataType: "json",
            cache: false,
            error: function (xhr, textStatus, errorThrown) {
                ...
            },
            success: function (data, textStatus, xhr) {
                ...
            }
           });

...最后 (4) 在服务器端逻辑中检查接收到的 nonce。

add_action( 'wp_ajax_nopriv_skydrv-hotlink', 'myplg_handle_ajax_request' );
add_action( 'wp_ajax_skydrv-hotlink', 'myplg_handle_ajax_request' );
function myplg_handle_ajax_request() {
    check_ajax_referer( 'myplg-nonce', 'nonce' );  // <<=-----
    if (isset($_GET['docid'])) {
        $docid = $_GET['docid'];
        $response = myplg_generate_the_response($docid);
        header( "Content-Type: application/json" );
        echo json_encode( $response ) ;
    }
    else {
        $response = array("error" => "you must specify a docid parameter.");
        echo json_encode( $response ) ;
    }

    exit;
}

但是检查是如何真正起作用的呢?

【问题讨论】:

    标签: ajax wordpress nonce


    【解决方案1】:

    Revising some AJAX procedures,我遇到了同样的问题。检查function code

    function check_ajax_referer( $action = -1, $query_arg = false, $die = true ) {
        if ( $query_arg )
            $nonce = $_REQUEST[$query_arg];
        else
            $nonce = isset($_REQUEST['_ajax_nonce']) ? $_REQUEST['_ajax_nonce'] : $_REQUEST['_wpnonce'];
    
        $result = wp_verify_nonce( $nonce, $action );
    
        if ( $die && false == $result ) {
            if ( defined( 'DOING_AJAX' ) && DOING_AJAX )
                wp_die( -1 );
            else
                die( '-1' );
        }
    
        do_action('check_ajax_referer', $action, $result);
    
        return $result;
    }
    

    如果wp_verify_noncefalse 并且您没有在$die 参数中发送false,那么它将执行wp_die( -1 );


    在您的示例代码中,check_ajax_referer() 将中断执行并将-1 返回到 AJAX 调用。如果您想自己处理错误,请添加参数$die 并使用$do_check 执行您的操作:

    $do_check = check_ajax_referer( 'myplg-nonce', 'nonce', false ); 
    

    请注意,在 WordPress 中处理 AJAX 的正确方法是:registerenqueuelocalize JavaScript 文件使用 wp_enqueue_scripts 而不是 wp_print_scripts
    请参阅 Use wp_enqueue_scripts() not wp_print_styles()

    【讨论】:

    • 您即将获得徽章,因为我会在我发布问题 14 个月后接受您的回答。谢谢!
    • 我认为当有 2 个赞成票时徽章就会出现;)很高兴看到一个旧 Q 被解决,不客气!
    【解决方案2】:

    这只是一个测试“nonce”代码是否与给定的代码匹配,因此黑客无法插入并获取您数据库的快捷方式。如果安全码不匹配,php 将死掉,页面将停止。

    “如果您的代码被正确验证,它将继续过去,否则将触发 die('-1'); 停止您的代码死亡。”

    【讨论】:

      猜你喜欢
      • 2011-06-26
      • 2021-08-15
      • 2011-10-11
      • 2013-07-05
      • 1970-01-01
      • 1970-01-01
      • 2014-09-29
      • 2011-06-01
      • 1970-01-01
      相关资源
      最近更新 更多