0

我正在使用 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/

请帮助我在哪里出错。

4

1 回答 1

1

这是正常的行为——nonce是 Wordpress 用来检查表单有效性以防止 CSRF 攻击的令牌。

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;

那么随机数呢?

在 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更改值。$result wp_nonce_ays

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

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

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

于 2015-09-22T10:35:11.307 回答