この手のプラグインはいくつか作ったのですが、今回は強制ファイルリネームの続きとなります。以前にも同じようなプラグインは作成したのですが、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





