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?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Überarbeitung einige AJAX-Verfahren, Kam ich auf die gleiche Frage. Und es ist einfach eine Frage der Prüfung der Funktion code:
Wenn
wp_verify_nonce
istfalse
und Sie haben nicht gesendetfalse
im$die
parameter, dann wird es ausführenwp_die( -1 );
.In deinem Beispielcode
check_ajax_referer()
bricht die Ausführung und zurück-1
zu den AJAX-call. Wenn Sie möchten, um den Fehler zu behandeln sich selbst, fügen Sie den parameter$die
und tun Sie Ihre Sachen mit$do_check
:Beachten Sie, dass die richtige Art und Weise zu behandeln AJAX in WordPress: registrieren, enqueue und lokalisieren die JavaScript-Dateien mit
wp_enqueue_scripts
stattwp_print_scripts
.Siehe Verwenden wp_enqueue_scripts() nicht wp_print_styles().
Es ist nur ein test, die "nonce" - code entspricht dem, was gegeben wurde, so kann ein hacker nicht in cut und Holen Sie sich eine Verknüpfung zu Ihrer Datenbank. Wenn der Sicherheitscode nicht übereinstimmt, wird die php-sterben, und die Seite wird halt.
"Wenn Sie den code korrekt verifiziert wird fortgesetzt, wenn nicht wird es auslösen die('-1'); beenden Sie Ihren code Toten."