为什么我从check_admin_referer()得到403?

时间:2018-03-17 作者:user3574603

我编写了一个类来使用ajax。我最初使用check_admin_referer (英寸hello()) 没有参数,但得到以下警告:“PHP注意:check\\u admin\\u referer被调用incorrectly. 您应该使用第一个参数指定要验证的nonce操作。“”

所以我去了抄本,试着按照example. 但是,检查失败。我现在得到一个403.

这是我的班级:

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();
    }
}
我能想到的唯一原因是,操作名称不正确,因为我没有指向实例方法,但我对PHP和WP是新手,我的Google foo让我失望。

我做错了什么。我如何获得check_admin_referer() 要通过吗?

Update

以下是JS:

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

2 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

在JS脚本中,将nonce包含在data, 如下例所示:

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

Additional Note

<?php wp_nonce_field(\'hello\', \'token\'); ?>
生成隐藏的input 标记类似于:

<input type="hidden" id="token" name="token" value="d9e3867a0e" />
即,临时名称成为name 以及idinput.

这就解释了token: $( \'#token\' ).val() 在我提供的代码中,格式为NONCE_NAME: $( \'#NONCE_NAME\' ).val().

但是,您也可以针对name 像这样:token: $( \'input[name="token"]\' ).val()

SO网友:Mark Kaplun

顾名思义check_admin_referer 检查referer是否为管理页。Wordpress通常会在管理表单中添加一个referer字段作为隐藏输入,您也可以这样做,但基本上不应该在AJAX中使用它,除非您的AJAX仅限于管理端。只需使用nonce验证即可。

在任何情况下,死亡(这是什么check_admin_referer 是)不是处理AJAX请求的最佳策略,您很可能希望有一些更定制的“错误”指示和消息。

结束

相关推荐

Nonce and widget

我已经筛选了几个小部件的代码,但没有发现其中任何一个处理nonce。我还查看了WP\\u Widget类,但也没有发现任何相关内容。这是抄本:(https://codex.wordpress.org/Widgets_API)class Foo_Widget extends WP_Widget { function __construct() { //something } public function widget( $a