WordPressでアップロードされるファイルの名前を強制変更―続編

WordPressでアップロードされるファイルの名前を強制変更―続編

この手のプラグインはいくつか作ったのですが、今回は強制ファイルリネームの続きとなります。以前にも同じようなプラグインは作成したのですが、Gutenbergを経由する場合にpost-title(ファイルのタイトル)がリネームされないバグがありました。今回は強制的にファイル名も指定し、憶測を不可能にしてみます。

REST APIを経由する場合とメディアアップロードの違い

WordPressの内部構造として、メディアアップロードを使う場合とGutenberg(エディタ)を経由する場合で処理が異なります。ここでハマったので備忘録として記します。

Gutenberg経由とメディアアップロード経由の違い

Gutenberg経由の場合は、内部的にREST APIを呼んでいます。そのためメディアアップロードとは経路が微妙に異なっています。メディアアップロードの場合はwp_handle_upload_prefilterとwp_handle_sideload_prefilterにhookすれば、ファイル投稿時のpost titleを強制的に弄ることができますが、Gutenbergを経由する場合、rest_pre_insert_attachmentにhookする必要があります。例えばGutenberg経由のファイル名を強制的にリネームする場合は

add_filter('rest_pre_insert_attachment', 'mfn_rest_force_rename', 10, 2);

function mfn_rest_force_rename($prepared_post, $request) {
	if ( ! get_option('mfn_enable_rename', 1) ) {
		return $prepared_post;
	}
	$random = md5(uniqid('', true));

	$prepared_post->post_title = sprintf(
		esc_html($random, 'move-file-name'),
		date_i18n('Y-m-d H:i:s', current_time('timestamp', 0))
	);

	return $prepared_post;
}

のように記述する必要があります。上記の例ではアップロードされたファイルを強制的にMD5生成しています。ハッシュの元がないので推測不可能です。試しに次の画像をアップロードします。

Gutenberg経由の場合はこのようなファイル名になりました。

逆にメディアアップロードの場合はwp_handle_upload_prefilterにhookすれば良いため、ファイル名とタイトルが一致します。

地味なところですが、ファイル名でうっかり情報漏洩の線を完全につぶすなら、REST API経由とwp_handle経由の両方にフックしないと名前は変わりません。というわけでGitHubにファイルをアップロードしました。

https://github.com/fofofoxdayooooo/redfox-wordpress-secure-plugin/tree/main/move-file-name

コメントを投稿する

メールアドレスは公開されませんのでご安心ください。 * が付いている欄は必須項目となります。

内容に問題なければ、下記の「コメントを送信する」ボタンを押してください。

ページの先頭