web-dev-qa-db-fra.com

Pourquoi ai-je un 403 de check_admin_referer ()?

J'ai écrit un cours sur lequel jouer avec l'ajax. A l'origine, j'avais utilisé check_admin_referer (dans hello()) sans arguments, mais l'avertissement suivant était émis: "Avis de PHP: check_admin_referer était appeléincorrectly. Vous devez spécifier une action nonce à vérifier à l'aide du premier paramètre."

Je me suis donc dirigé vers le codex et j'ai essayé de suivre l'exemple exemple . Cependant, la vérification échoue. Je reçois maintenant un 403.

Voici ma classe:

class StupidClass {

    private $settings_page;

    // scripts, 
    public function __construct(){
        add_action('admin_menu', array($this, 'add_menu'));
        add_action('admin_enqueue_scripts', array($this, 'load_scripts'));
        add_action('wp_ajax_hello', array($this, 'hello'));
    }

    // setup
    public function add_menu(){
        $this->settings_page = add_menu_page( 'Menu item', 'settings page', 'edit_pages', 'settingspage', array($this, 'render_page'), false, 62 );
    }

    public function load_scripts($hook){
        if ($this->settings_page !== $hook) {
            return;
        }

        $path = plugin_dir_url( __FILE__ ) . 'stupid.js';
        wp_enqueue_script( 'stupid_js', $path, array('jquery'));
    }

    // view
    public function render_page(){
        ?>
        <h1>This is the title</h1>
        <form action="" id="stupid_form" method="post">
            <?php wp_nonce_field('hello', 'token'); ?>
            <input type="submit" value="hit me">
        </form>
        <div id="response"></div>
        <?php
    }

    public function hello(){
        check_admin_referer('hello', 'token');
        wp_die();
    }
}

La seule raison pour laquelle je peux penser est que le nom de l'action est incorrect car je ne pointe pas vers la méthode d'instance, mais je suis nouveau pour PHP et WP, et mon foo Google me manque.

Qu'est-ce que je fais mal. Comment puis-je obtenir check_admin_referer() pour passer?

Update

Voici le JS:

jQuery(document).ready(function($){
    data = {
        action: 'hello'
    }
    $('#stupid_form').submit(function(){
        $.post(ajaxurl, data, function(response){
            $('#response').html(response);
        });
        return false;
    });
});
1
user3574603

Dans le script JS, incluez lenoncedans data, comme dans l'exemple suivant:

jQuery(document).ready(function($){
    data = {
        action: 'hello',
        token: $( '#token' ).val()
    }
    $('#stupid_form').submit(function(){
        $.post(ajaxurl, data, function(response){
            $('#response').html(response);
        });
        return false;
    });
});

Remarque additionnelle

<?php wp_nonce_field('hello', 'token'); ?>

génère une variable input avec un balisage semblable à:

<input type="hidden" id="token" name="token" value="d9e3867a0e" />

c'est-à-dire que le nomnoncedevient le name ainsi que le id du input.

Cela explique la token: $( '#token' ).val() dans le code que j'ai fourni, où le format est NONCE_NAME: $( '#NONCE_NAME' ).val().

Cependant, vous pouvez aussi cibler la name comme ceci: token: $( 'input[name="token"]' ).val()

3
Sally CJ

Comme son nom l'indique, check_admin_referer vérifie que le référant était une page d'administrateur. Wordpress ajoute généralement un champ de référence en tant qu'entrée masquée dans les formulaires d'administration. Vous pouvez en faire de même. Toutefois, il ne doit pas être utilisé dans AJAX, à moins que votre ajax soit limité au côté administrateur. Utilisez simplement la vérification nonce à la place.

Dans tous les cas, la mort (ce que fait check_admin_referer) n’est pas la meilleure stratégie pour traiter les demandes AJAX et vous souhaiterez sans doute avoir une indication et un message plus personnalisés "d'erreur".

1
Mark Kaplun