web-dev-qa-db-ja.com

ユーザーパスワードフィールドが空です

注:実際には、説明されている状況はローカル環境にあります。この設定で問題が発生した場合はどうなりますか。

プラグインをインストールしましたが、WPデータベース内のすべてのパスワードがリセットされました。そのため、既存のユーザーのパスワードはすべて空になりました。個人ユーザー用に新しいパスワードを生成しました。他のユーザーについては、データベースのパスワードを空白のままにしてもいいですか、それとも危険ですか?空のパスワードでログインしようとすると、ワードプレスではログインできないことに気付きました。

2
testermaster

それはおそらくどういうわけか悪用可能であるので、私はまだこれをお勧めしません...

技術的には、正しいフックと関数がすべて呼び出されたと仮定すると、データベースのuser_passフィールドが空の場合でも、空白のパスワードを入力するとユーザーはログインできなくなります。

なぜ...?

/wp-login./phpで見られるようにフォームを使ってログインしようとすると、WordPressはauthenticateアクションにフックされているwp_authenticate_username_password()を呼び出します。

wp_authenticate_username_password()は、送信された$passwordが空ではないかどうかを確認します。空の場合はWP_Errorのインスタンスが発生し、ログイン要求は拒否されます。

正しいフックや関数が呼び出されていると仮定して、カスタムログインフォームであろうとなかろうと、あなたがどこからログインしようとしても同じことが当てはまります。 authenticateまたはwp_authenticate_username_password()

wp_check_password()wp_authenticate_username_password()ポイントに到達しても、md5()を実行したときに空のパスワードがハッシュ値を生成します。 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 );

}

[OK]をクリックしたら

if ( strlen($hash) <= 32 ) {
    $check = hash_equals( $hash, md5( $password ) );

$checkの値は空の文字列であり、md5($password)の値(本質的にmd5(''))は$hashであるため、d41d8cd98f00b204e9800998ecf8427eはfalseを返します。

そのため、ログイン試行は拒否されます。

理論的には、悪意のあるコードが次のコードにフックしない限り、安全です。

return apply_filters( 'check_password', $check, $password, $hash, $user_id );

...そしてtrueを返します。しかし、データベースに適切なパスワードハッシュが存在する通常の状況では、だれでもそれを実行できます。

勧告:

データベース内のuser_passフィールドを空のままにし、ハッシュを無効にすることは、ずさんな慣習ではありません。

誰かがデータベース内のすべてのパスワードが空白であなたをめちゃくちゃにしたがっていることを知っていたと仮定すると、そうすることでそれらはそこに途中であるでしょう。彼らがする必要があるのは、システムを悪用する方法を見つけることだけです。

すべての内部コアコード、プラグインからのコード、そしておそらくあなたのテーマを監査したことはありそうもないので、Edgeパスワードのために空白のパスワードが戻ってくるのかどうかはわかりません。導入されるケースゼロデイエクスプロイト。

代わりに...

//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);
}

...自分で好きなことをして、すべてのユーザーにパスワードを設定し、ユーザーにパスワードをリセットさせるか、パスワードリセットリンク付きの電子メールを生成させます。

1
userabuser