この記事は最後に更新してから1年以上経過しています。

バージョン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


お勧め

wp_add_post_tags(2012年7月5日 更新)

mixed wp_add_post_tags( [ int $post_id = 0 [ , string $tags = '' ] ] )
投稿情報に投稿タグを追加する。

get_tags(2018年5月27日 更新)

array get_tags( [ mixed $args = '' ] )
条件を指定してタグ情報を検索し、マッチしたすべてのタグ情報を取得する。

wp_array_slice_assoc(2022年2月2日 更新)

array wp_array_slice_assoc( array $array, array $keys )
キーを指定して配列の一部を抽出する。

get_post_permalink(2022年11月6日 更新)

string | false get_post_permalink( [ int | WP_Post $id$post = 0 [ , bool $leavename = false [ , bool $sample = false ] ] ] )
カスタム投稿タイプの投稿ページのパーマリンクを取得する。

remove_query_arg(2024年3月21日 更新)

string remove_query_arg( string | string[] $key [ , bool | string $query = false ] )
クエリーURIからパラメータ(キー名=値)を削除する。