Wie funktioniert check_ajax_referer() wirklich funktionieren?

Smart WordPress-Leute sagen , dass die plugin-Entwickler sollte beschäftigen eine nonce in jedem AJAX-request gesendet wird, von einer Seite zurück zu den wordpress-blog admin-ajax.php).

Dies geschieht durch (1) erzeugen einer nonce, die auf der server-Seite, über

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

...(2) die Herstellung, die nonce zur Verfügung, um Javascript-code, sendet AJAX Anfragen. Zum Beispiel könnte man es so machen:

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

...und dann (3) die javascript-ajax-Logik, Referenzen, Globale Variablen.

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

...und schließlich (4) die Prüfung der empfangenen nonce in die server-seitige Logik.

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

Aber wie funktioniert der check wirklich funktionieren?

InformationsquelleAutor Cheeso | 2012-06-03
Schreibe einen Kommentar