J'ai vu quelques discussions sur l'obtention de Wordpress pour régénérer un nonce unique pour les demandes Ajax subséquentes, mais pour la vie de moi, je ne peux pas vraiment demander à Wordpress de le faire - chaque fois que je demande ce que je pense être un nouveau nonce, je reçois le même nonce de Wordpress. Je comprends le concept de nonce_life de WP et même de le définir sur autre chose, mais cela ne m'a pas aidé.
Je ne génère pas le nonce dans l'objet JS dans l'en-tête via la localisation - je le fais sur ma page d'affichage. Je peux obtenir ma page pour traiter la demande Ajax, mais lorsque je demande un nouveau nonce à WP dans le rappel, je reçois le même nonce et je ne sais pas ce que je fais mal ... En fin de compte, je veux étendre cela afin qu'il puisse y avoir plusieurs éléments sur la page, chacun avec la possibilité d'ajouter / supprimer - j'ai donc besoin d'une solution qui permettra plusieurs demandes Ajax ultérieures à partir d'une page.
(Et je dois dire que j'ai mis toutes ces fonctionnalités dans un plugin, donc la "page d'affichage" frontale est en fait une fonction incluse avec le plugin ...)
functions.php: localiser, mais je ne crée pas de nonce ici
wp_localize_script('myjs', 'ajaxVars', array('ajaxurl' => 'admin-ajax.php')));
Appeler JS:
$("#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
}
}
});
});
Réception de PHP:
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();
}
Fonction d'affichage PHP frontend, parmi lesquels:
$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>';
À ce stade, je serais vraiment reconnaissant pour tout indice ou pointeur pour que WP régénère un nonce unique pour chaque nouvelle demande Ajax ...
MISE À JOUR: J'ai résolu mon problème. Les extraits de code ci-dessus sont valides, mais j'ai modifié la création $ newNonce dans le rappel PHP pour ajouter une chaîne de microsecondes afin de garantir qu'elle est unique dans les requêtes Ajax suivantes.
Réponses:
Voici une réponse très longue à ma propre question qui va au-delà de la simple question de générer des nonces uniques pour les requêtes Ajax suivantes. Il s'agit d'une fonctionnalité "ajouter aux favoris" qui a été rendue générique aux fins de la réponse (ma fonctionnalité permet aux utilisateurs d'ajouter les ID de publication des pièces jointes à une liste de favoris, mais cela pourrait s'appliquer à une variété d'autres fonctionnalités qui s'appuient sur Ajax). J'ai codé cela en tant que plugin autonome, et il manque quelques éléments - mais cela devrait être suffisamment détaillé pour fournir l'essentiel si vous souhaitez répliquer la fonctionnalité. Cela fonctionnera sur une publication / page individuelle, mais cela fonctionnera également dans les listes de publications (par exemple, vous pouvez ajouter / supprimer des éléments dans les favoris en ligne via Ajax et chaque publication aura son propre nonce unique pour chaque demande Ajax). Gardez à l'esprit qu'il
scripts.php
favorites.js (Beaucoup de choses de débogage qui peuvent être supprimées)
Fonctions (affichage frontal et action Ajax)
Pour afficher le lien Ajouter / Supprimer des favoris, appelez-le simplement sur votre page / publication via:
Fonction d'affichage frontal:
Fonction d'action Ajax:
la source
Je dois vraiment remettre en question le raisonnement derrière l'obtention d'un nouveau nonce pour chaque demande ajax. Le nonce d'origine expirera, mais il peut être utilisé plusieurs fois jusqu'à ce qu'il le fasse. Avoir le javascript le recevoir via ajax va à l'encontre du but, en particulier le fournir en cas d'erreur. (Le but des nonces étant un peu de sécurité pour associer une action à un utilisateur dans un laps de temps.)
Je ne suis pas censé mentionner d'autres réponses, mais je suis nouveau et ne peux pas commenter ci-dessus, donc en ce qui concerne la "solution" publiée, vous obtenez un nouveau nonce à chaque fois mais ne l'utilisez pas dans la demande. Il serait certainement difficile d'obtenir les mêmes microsecondes à chaque fois pour correspondre à chaque nouveau nonce créé de cette façon. Le code PHP vérifie par rapport au nonce d'origine, et le javascript fournit le nonce d'origine ... donc cela fonctionne (car il n'a pas encore expiré).
la source
check_ajax_referer
renvoie -1, ce qui n'est pas ce que nous voulons!