注:実際には、説明されている状況はローカル環境にあります。この設定で問題が発生した場合はどうなりますか。
プラグインをインストールしましたが、WPデータベース内のすべてのパスワードがリセットされました。そのため、既存のユーザーのパスワードはすべて空になりました。個人ユーザー用に新しいパスワードを生成しました。他のユーザーについては、データベースのパスワードを空白のままにしてもいいですか、それとも危険ですか?空のパスワードでログインしようとすると、ワードプレスではログインできないことに気付きました。
それはおそらくどういうわけか悪用可能であるので、私はまだこれをお勧めしません...
技術的には、正しいフックと関数がすべて呼び出されたと仮定すると、データベースの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);
}
...自分で好きなことをして、すべてのユーザーにパスワードを設定し、ユーザーにパスワードをリセットさせるか、パスワードリセットリンク付きの電子メールを生成させます。