Il est clair que les soumissions de formulaires et les demandesAJAX, en particulier les demandes raisonnables, nécessitent des "nonces" pour éviter certains exploits. Cependant, avec une utilisation intensive des systèmes de mise en cache, il devient plus difficile de les générer et de générer de nouvelles ressources au lieu de celles en cache.
Pour résoudre le problème, j'ai envisagé de créer une fonction AJAX qui renvoie un nouveau message, à demander avant l'envoi d'un formulaire. Ce nonce sera ensuite ajouté au formulaire en tant que champ masqué.
Pensez-vous que c'est une approche sûre?
Fonction PHP pour renvoyer un nouveau nonce:
function create_nonce() {
return wp_create_nonce('my-nonce');
}
add_action('wp_ajax_create_nonce', 'create_nonce');
add_action('wp_ajax_nopriv_create_nonce', 'create_nonce');
Soumettez le formulaire ( request () est une fonction personnalisée que j'ai créée pour faire facilement des requêtes ajax):
$('form').on('submit', function(e){
e.preventDefault();
var $form = $(this);
request('create_nonce', function(nonce){
// Append the fresh nonce to the form
$form.append('<input type="hidden" name="nonce" value="'+nonce+'">');
// Proceed with the form submission...
});
});
Je sais que cette question est ancienne, mais non, ce n'est pas très sécurisé.
Toute personne connaissant le noeud final [AJAX] serait en mesure de générer des informations valides, ce qui irait à l’encontre du but recherché.
Cela étant dit, les nonces sont une défense de bas niveau en premier lieu: ils n'arrêtent que les attaques les plus simples. Un attaquant intelligent aurait tout d’abord parcouru votre page d’accueil et englouti tous les nonces (qui a une durée de vie par défaut de 24 heures ces jours-ci), puis n’utiliser que ce nonce pour l’attaque. Votre noeud final AJAX simplifie légèrement cette tâche.
MODIFIER
Comme Janh l'a fait remarquer, tant que les nonces sont spécifiques à l'utilisateur, ce qui signifie qu'un nonce ne fonctionnera que pour un utilisateur spécifique. Dans ce cas, un nonce généré par ajax devrait convenir. Vous devrez probablement envoyer un peu plus d'informations via le noeud final AJAX, de sorte que le nonce renvoyé est lié au bon utilisateur.