我仍然不建议这样做,因为它可能会以某种方式被利用。。。
从技术上讲,假设调用了所有正确的钩子和函数,如果提供空白密码,即使user_pass
数据库中的字段为空。
为什么
当您尝试使用上所示的表单登录时
/wp-login./php
, WordPress将呼叫
wp_authenticate_username_password()
连接到
authenticate
行动
wp_authenticate_username_password()
检查是否已提交$password
不为空。如果为空,它将引发WP_Error
并且登录请求将被拒绝。
假设调用了正确的钩子或函数,那么无论您尝试从何处登录,无论是否是自定义登录表单,都同样适用。authenticate
或wp_authenticate_username_password()
.
现在即使你成功了wp_check_password()
点的wp_authenticate_username_password()
, 空密码在运行时仍会生成哈希值md5()
, e、 g。md5(\'\') //d41d8cd98f00b204e9800998ecf8427e
.
那么当我们进入wp_check_password()
功能是运行以下逻辑。。。
资料来源:wp-includes/pluggable.php
function wp_check_password($password, $hash, $user_id = \'\') {
global $wp_hasher;
//note that...
//$password = \'\' and $hash (from db) = \'\'
// If the hash is still md5...
if ( strlen($hash) <= 32 ) {
$check = hash_equals( $hash, md5( $password ) ); // <- $check will return false, because the $hash is empty and does not match the hash of md5($password)
if ( $check && $user_id ) {
// Rehash using new hash.
wp_set_password($password, $user_id);
$hash = wp_hash_password($password);
}
/**
* Filter whether the plaintext password matches the encrypted password.
*
* @since 2.5.0
*
* @param bool $check Whether the passwords match.
* @param string $password The plaintext password.
* @param string $hash The hashed password.
* @param int $user_id User ID.
*/
return apply_filters( \'check_password\', $check, $password, $hash, $user_id );
}
// If the stored hash is longer than an MD5, presume the
// new style phpass portable hash.
if ( empty($wp_hasher) ) {
require_once( ABSPATH . WPINC . \'/class-phpass.php\');
// By default, use the portable hash from phpass
$wp_hasher = new PasswordHash(8, true);
}
$check = $wp_hasher->CheckPassword($password, $hash);
/** This filter is documented in wp-includes/pluggable.php */
return apply_filters( \'check_password\', $check, $password, $hash, $user_id );
}
好的,一旦我们击中:
if ( strlen($hash) <= 32 ) {
$check = hash_equals( $hash, md5( $password ) );
$check
将返回false,因为
$hash
是空字符串,值为
md5($password)
基本上
md5(\'\')
是
d41d8cd98f00b204e9800998ecf8427e
正如我上面提到的。
因此,登录尝试将被拒绝。
因此,从理论上讲,除非某些恶意代码钩住:
return apply_filters( \'check_password\', $check, $password, $hash, $user_id );
...和返回
true
. 但任何人都可以在正常情况下这样做,因为数据库中确实存在正确的密码哈希。
建议:
离开
user_pass
数据库中的字段“空”和“空”散列是草率和糟糕的做法。
假设有人知道数据库中的所有密码都是空的,并且想欺骗你,他们这样做已经成功了一半。他们所需要做的就是找到一种利用该系统的方法。
鉴于您不太可能审核过每一段内部核心代码以及插件和主题中的代码,您不知道什么时候或是否会因为引入的边缘案例零日攻击而返回空白密码来攻击您。
相反
//you can use get_users() if you prefer instead of $wpdb directly...
//this is just a one time operation.. don\'t forget to exclude those
//users whom you do not wish to reset a password for, e.g. yourself
global $wpdb;
$users = $wpdb->get_col("SELECT ID FROM {$wpdb->prefix}users WHERE 1 = 1");
foreach ($users as $user_id) {
wp_set_password(wp_generate_password(), $user_id);
}
。。。帮自己一个忙,为所有用户设置密码,让用户重置密码或生成带有密码重置链接的电子邮件。