User password field is empty

时间:2016-02-21 作者:testermaster

注:实际上,所描述的情况是在本地环境中发生的。我想知道如果它与此设置一起使用会发生什么。

我安装了一个插件,它重置了WP数据库中的所有密码,所以现在现有用户的所有密码都是空的。我已经为我的个人用户生成了一个新密码。关于其他用户,我是否可以在数据库中保留密码为空,或者这是否有危险?我注意到,如果我尝试使用空密码登录,那么在wordpress中登录是不可能的。

1 个回复
最合适的回答,由SO网友:Adam 整理而成

我仍然不建议这样做,因为它可能会以某种方式被利用。。。

从技术上讲,假设调用了所有正确的钩子和函数,如果提供空白密码,即使user_pass 数据库中的字段为空。

为什么

当您尝试使用上所示的表单登录时/wp-login./php, WordPress将呼叫wp_authenticate_username_password() 连接到authenticate 行动

wp_authenticate_username_password() 检查是否已提交$password 不为空。如果为空,它将引发WP_Error 并且登录请求将被拒绝。

假设调用了正确的钩子或函数,那么无论您尝试从何处登录,无论是否是自定义登录表单,都同样适用。authenticatewp_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);
}
。。。帮自己一个忙,为所有用户设置密码,让用户重置密码或生成带有密码重置链接的电子邮件。

相关推荐

是否有必要清理wp_set_password用户输入?

我正在尝试向WP注册表添加密码表单。请参见下面的代码。我想知道是否需要清理这个特定的用户输入?(如果是,怎么做?)如果我理解正确,WP为某些东西内置了净化功能,密码可能就是其中之一。对吗?WP会在将其添加到数据库之前自动对其进行清理吗?add_action( \'register_new_user\', \'registration_change_pass\', 10, 99 ); function registration_change_pass( $user_id ) { &