这是正常的行为——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 之前对该函数进行更多测试。