我正在使用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/
请在我错误的地方帮助我。
答案 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;
在最新版本的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之前在该函数中进行更多测试。