Ich habe einige Diskussionen darüber gesehen, wie Wordpress eine eindeutige Nonce für nachfolgende Ajax-Anfragen neu generieren kann, aber für mein Leben kann ich Wordpress nicht dazu bringen, dies zu tun - jedes Mal, wenn ich anfordere, was meiner Meinung nach neu sein sollte nonce, ich bekomme das gleiche nonce von Wordpress zurück. Ich verstehe das Konzept von WP's nonce_life und setze es sogar auf etwas anderes, aber das hat mir nicht geholfen.
Ich generiere das Nonce im JS-Objekt im Header nicht über die Lokalisierung - ich mache es auf meiner Anzeigeseite. Ich kann meine Seite dazu bringen, die Ajax-Anfrage zu verarbeiten, aber wenn ich im Rückruf eine neue Nonce von WP anfordere, bekomme ich dieselbe Nonce zurück und weiß nicht, was ich falsch mache ... Letztendlich möchte ich Erweitern Sie dies so, dass sich auf der Seite mehrere Elemente befinden können, die jeweils hinzugefügt / entfernt werden können. Daher benötige ich eine Lösung, die mehrere nachfolgende Ajax-Anforderungen von einer Seite aus zulässt.
(Und ich sollte sagen, dass ich all diese Funktionen in ein Plugin integriert habe, sodass die Front-End- "Anzeigeseite" tatsächlich eine Funktion ist, die im Plugin enthalten ist ...)
functions.php: lokalisieren, aber ich erstelle hier keine Nonce
wp_localize_script('myjs', 'ajaxVars', array('ajaxurl' => 'admin-ajax.php')));
JS anrufen:
$("#myelement").click(function(e) {
e.preventDefault();
post_id = $(this).data("data-post-id");
user_id = $(this).data("data-user-id");
nonce = $(this).data("data-nonce");
$.ajax({
type: "POST",
dataType: "json",
url: ajaxVars.ajaxurl,
data: {
action: "myfaves",
post_id: post_id,
user_id: user_id,
nonce: nonce
},
success: function(response) {
if(response.type == "success") {
nonce = response.newNonce;
... other stuff
}
}
});
});
PHP empfangen:
function myFaves() {
$ajaxNonce = 'myplugin_myaction_nonce_' . $postID;
if (!wp_verify_nonce($_POST['nonce'], $ajaxNonce))
exit('Sorry!');
// Get various POST vars and do some other stuff...
// Prep JSON response & generate new, unique nonce
$newNonce = wp_create_nonce('myplugin_myaction_nonce_' . $postID . '_'
. str_replace('.', '', gettimeofday(true)));
$response['newNonce'] = $newNonce;
// Also let the page process itself if there is no JS/Ajax capability
} else {
header("Location: " . $_SERVER["HTTP_REFERER"];
}
die();
}
Frontend-PHP-Anzeigefunktion, darunter:
$nonce = wp_create_nonce('myplugin_myaction_nonce_' . $post->ID);
$link = admin_url('admin-ajax.php?action=myfaves&post_id=' . $post->ID
. '&user_id=' . $user_ID
. '&nonce=' . $nonce);
echo '<a id="myelement" data-post-id="' . $post->ID
. '" data-user-id="' . $user_ID
. '" data-nonce="' . $nonce
. '" href="' . $link . '">My Link</a>';
An dieser Stelle wäre ich wirklich dankbar für irgendwelche Anhaltspunkte oder Hinweise WP in immer einen einzigartigen nonce für jede neue Ajax - Anfrage zu regenerieren ...
UPDATE: Ich habe mein Problem gelöst. Die obigen Codefragmente sind gültig. Ich habe jedoch die Erstellung von $ newNonce im PHP-Rückruf geändert, um eine Mikrosekundenzeichenfolge anzuhängen, um sicherzustellen, dass sie bei nachfolgenden Ajax-Anforderungen eindeutig ist.
Antworten:
Hier ist eine sehr ausführliche Antwort auf meine eigene Frage, die über die Frage hinausgeht, eindeutige Nonces für nachfolgende Ajax-Anfragen zu generieren. Dies ist eine Funktion zum Hinzufügen zu Favoriten, die für die Zwecke der Antwort allgemein festgelegt wurde (mit meiner Funktion können Benutzer die Post-IDs von Fotoanhängen zu einer Liste von Favoriten hinzufügen, dies kann jedoch auch für eine Vielzahl anderer Funktionen gelten, auf die sich diese stützen Ajax). Ich habe dies als eigenständiges Plugin codiert, und es fehlen einige Elemente - aber dies sollte ausreichend detailliert sein, um das Wesentliche zu liefern, wenn Sie die Funktion replizieren möchten. Es funktioniert für einen einzelnen Beitrag / eine einzelne Seite, aber auch für Listen von Beiträgen (z. B. können Sie über Ajax Elemente zu Favoriten inline hinzufügen / daraus entfernen, und jeder Beitrag hat für jede Ajax-Anfrage eine eigene eindeutige Nonce). Denken Sie daran, dass dort '
scripts.php
Favoriten.js (Viele Debug-Sachen, die entfernt werden können)
Funktionen (Frontend-Anzeige & Ajax-Aktion)
Um den Link Favoriten hinzufügen / entfernen auszugeben, rufen Sie ihn einfach auf Ihrer Seite / Ihrem Beitrag auf über:
Frontend-Anzeigefunktion:
Ajax-Aktionsfunktion:
quelle
Ich muss wirklich die Gründe hinterfragen, die dahinter stehen, für jede Ajax-Anfrage eine neue Nonce zu bekommen. Die ursprüngliche Nonce läuft ab, kann jedoch mehrmals verwendet werden, bis dies der Fall ist. Wenn das Javascript es über Ajax empfängt, wird der Zweck zunichte gemacht, insbesondere wenn es in einem Fehlerfall bereitgestellt wird. (Der Zweck von Nonces ist eine kleine Sicherheit für die Zuordnung einer Aktion zu einem Benutzer innerhalb eines Zeitrahmens.)
Ich sollte keine anderen Antworten erwähnen, aber ich bin neu und kann oben keinen Kommentar abgeben. In Bezug auf die veröffentlichte "Lösung" erhalten Sie jedes Mal eine neue Nonce, verwenden sie jedoch nicht in der Anfrage. Es wäre sicherlich schwierig, die Mikrosekunden jedes Mal gleich zu machen, um mit jeder neuen Nonce übereinzustimmen, die auf diese Weise erstellt wurde. Der PHP-Code wird gegen das ursprüngliche Nonce überprüft, und das Javascript liefert das ursprüngliche Nonce ... also funktioniert es (weil es noch nicht abgelaufen ist).
quelle
check_ajax_referer
gibt -1 zurück, was nicht das ist, was wir wollen!