バージョン6.8へのアップデートに伴いユーザーのパスワードハッシュが更新される件について

説明

WordPressバージョン6.8では、ユーザーのパスワードハッシュの生成方法が変更される。これに関連して、既存ユーザーのパスワードハッシュも更新されることがアナウンスされており、少し気になった。

パスワードハッシュの更新タイミング

パスワードハッシュが更新される件で一番気になったのが、更新されるタイミングである。というのも、WordPressでは「生」のパスワードは保持していないため、WordPress本体がバージョンアップされたタイミングでは更新できない。では、いつなのだろうか。

ログインページで入力されたパスワードに関連するのは、実際にユーザー認証を行っているwp_authenticate_username_passwordとwp_authenticate_email_password関数である(これらの関数は'authenticate'フィルターのコールバック関数として登録されている)。これらの関数のソースコードを見ていくと、各関数の終わる箇所に次のコードが見つかった。

	if ( wp_password_needs_rehash( $user->user_pass, $user->ID ) ) {
		wp_set_password( $password, $user->ID );
	}

	return $user;

バージョン6.8で定義された wp_password_needs_rehash関数によってパスワードハッシュの更新が必要かを判定し、更新が必要な場合は wp_set_password関数を使って(新しい)パスワードハッシュをセットしている。

整理すると、WordPressバージョン6.8にアップデート済みのサイトで、ユーザーがIDまたはメールアドレスとパスワードでログイン成功。その際にパスワードハッシュが旧来のものであればパスワードハッシュを更新するということになる。

すなわち、パスワードハッシュが更新されるのはパスワードを使ってログインに成功したタイミングに限定されるので、ログイン時に「ログイン状態を保持する」をチェックしてログイン中の場合や、GoogleやXなどの認証サービスを使ってログインした場合はパスワードハッシュが更新されることはないことがわかった。

パスワードハッシュを更新させない

さて、パスワードハッシュの更新が必要かを判定するwp_password_needs_rehash関数を見てみると、その返り値は'password_needs_rehash'フィルターで制御可能になっている。このフィルターを使えば、バージョン6.8にアップデートしたサイトでもパスワードハッシュを更新しないようにできる。コードは以下の通り。

add_filter( 'password_needs_rehash', '__return_false', 10, 3 );

実際にバージョン6.8にアップデートし、まだユーザーがログインしていない環境を整えて試したところ、意図した通りに動作し、パスワードハッシュは更新されなかった。

ちなみにパスワードハッシュが更新された場合は、wp_usersテーブルのuser_passカラムは次のような内容になる。

+----+-----------------------------------------------------------------+
| ID | user_pass                                                       |
+----+-----------------------------------------------------------------+
|  1 | $wp$2y$10$x.lU/aEUPocE4CQv0gQun.ls6GuC1Ou9gDDiyOsurWGTv3x4kVDac |
+----+-----------------------------------------------------------------+

更新されたユーザーのパスワードハッシュは、先頭が'$wp'から始まっている(詳しくは wp_hash_password関数を参照)。

ここでは、あくまでも一時的な対応としてパスワードハッシュを更新させない方法を紹介している。基本的にはパスワードハッシュは更新した方が安全であり、実施する場合は十分に理解して行ってほしい。


最終更新 : 2025年04月14日 16:11


お勧め

has_category(2012年1月17日 更新)

bool has_category( [ mixed $category = '' [ , mixed $post = null ] ] )
投稿記事がカテゴリーに属しているか調べる。

comments_template(2018年5月27日 更新)

void comments_template( string $file = '/comments.php' , bool $separate_comments = false )
投稿ページ(post)または単一ページ(page)のコメント情報を取得し、コメント表示・投稿用のテンプレートファイルを読み込んで表示する。

is_taxonomy_hierarchical(2018年5月27日 更新)

bool is_taxonomy_hierarchical( string $taxonomy )
タクソノミーに階層(親子)関係があるか調べる。

send_confirmation_on_profile_email(2018年5月27日 更新)

void send_confirmation_on_profile_email()
メールアドレス変更を確認するメールを送信する。

get_the_modified_time(2023年9月20日 更新)

string | int | false get_the_modified_time( [ string $format = '' [ , int | WP_Post $post = null ] ] )
パラメータ$formatで指定したフォーマットで投稿の更新時刻を取得する。