设置主题操作后在wordpress 4.3.1中使用nonce创建问题

时间:2015-09-22 08:47:15

标签: wordpress nonce

我正在使用add_action('after_setup_theme','custom_login');挂钩我的一个网站,自动将用户重定向到他的仪表板页面。 这是我的代码:---

 function custom_login($username, $password='') {
 $creds = array();
 $creds['user_login'] = $username;
 $creds['user_password'] = $password;
 $creds['remember'] = true;
 $user = wp_signon( $creds, false );
if ( is_wp_error($user) ){
 echo $user->get_error_message();
}
}
// run it before the headers and cookies are sent
add_action( 'after_setup_theme', 'custom_login' );

它在旧版本上运行良好,但现在我已经升级了wordpress版本及其与nonce的创建问题。 你确定你要这么做吗? 每当我执行更新插件,主题和永久链接等操作时,屏幕上都会显示此错误。

当我评论此代码时,网站正常工作,除了自动重定向功能。 这是我的网站网址: - https://www.linearrecruitment.co.uk/

请在我错误的地方帮助我。

1 个答案:

答案 0 :(得分:1)

这是一种正常行为 - nonce是Wordpress使用的一种令牌,用于检查表单的有效性以便prevent CSRF attacks

Wordpress中的有效登录表单应具有使用wp_nonce_field生成的隐藏输入字段:

wp_nonce_field('my_login_form');

然后在登录功能中使用wp_verify_nonce功能检查令牌:

if (!isset($_POST['my_login_form']) || !wp_verify_nonce($_POST['_wpnonce'], 'my_login_form')) {
  die('Invalid form');
}

您尝试执行的操作(自动登录)操作错误,因为add_action没有为after_setup_theme挂钩发送任何参数,因此您的用户名可能为空。我不知道它之前是如何工作的,也许它设法用空的用户名以某种方式登录。

我建议你为你的用户名和密码声明一些全局变量,因为它似乎是静态输入:

global $username, $password;
$username = 'my_login';
$password = 'my_password';

然后在函数的开头导入那些全局变量:

global $username, $password;

那么nonce呢?

在最新版本的Wordpress上,check_admin_referer发生了一些变化,来自:

function check_admin_referer( $action = -1, $query_arg = '_wpnonce' ) {
    if ( -1 == $action )
        _doing_it_wrong( __FUNCTION__, __( 'You should specify a nonce action to be verified by using the first parameter.' ), '3.2' );

    $adminurl = strtolower(admin_url());
    $referer = strtolower(wp_get_referer());
    $result = isset($_REQUEST[$query_arg]) ? wp_verify_nonce($_REQUEST[$query_arg], $action) : false;
    if ( !$result && !(-1 == $action && strpos($referer, $adminurl) === 0) ) {
        wp_nonce_ays($action);
        die();
    }
    do_action( 'check_admin_referer', $action, $result );
    return $result;
}

致:

function check_admin_referer( $action = -1, $query_arg = '_wpnonce' ) {
    if ( -1 == $action )
        _doing_it_wrong( __FUNCTION__, __( 'You should specify a nonce action to be verified by using the first parameter.' ), '3.2' );

    $adminurl = strtolower(admin_url());
    $referer = strtolower(wp_get_referer());
    $result = isset($_REQUEST[$query_arg]) ? wp_verify_nonce($_REQUEST[$query_arg], $action) : false;
    do_action( 'check_admin_referer', $action, $result );

    if ( ! $result && ! ( -1 == $action && strpos( $referer, $adminurl ) === 0 ) ) {
        wp_nonce_ays( $action );
        die();
    }

    return $result;
}

正如您所看到的那样,他们移动了check_admin_referer钩子 - 现在我们可以在<{em> $result函数之前更改wp_nonce_ays 的值(显示正如所调用的那样,你试图摆脱的消息。

这意味着我们可以在主题 functions.php 中添加以下钩子以强制进行随机数验证:

add_action( 'check_admin_referer', array('custom_check_admin_referer' ) );
function custom_check_admin_referer() {
    return 1;
}

这应该解决您的问题,但您必须意识到这可能是一个安全问题 - 您可能希望在返回1之前在该函数中进行更多测试。