テーマやプラグインから Medifence の挙動を拡張・診断するための開発者向け情報です。
公開API(medifence_allow_access フィルター)
アクセス可否の最終判定は medifence_allow_access フィルターで上書きできます。既定の判定(ログイン済みか → 設定された capability を持つか → 有効な共有リンクか)の後に適用されるため、すべての決定を変更できます。
add_filter( 'medifence_allow_access', function ( $allowed, $file_path ) {
// 例: 特定のロールにのみ許可する。
if ( ! current_user_can( 'edit_posts' ) ) {
return false;
}
return $allowed;
}, 10, 2 );
$allowed は既定判定の結果、$file_path は realpath() 解決済みの絶対パスです(パス検証を通過したリクエストでのみ呼ばれます)。戻り値がそのまま最終的なアクセス可否になります。なお保護対象外のファイル(除外パス・除外拡張子など)では、認可判定に入る前に配信されるためフィルターは呼ばれません。
共有リンクの仕組み
共有リンクは、ファイルの通常の URL に次の 2 つのクエリを付けたものです。
mf_expires— 失効時刻(Unix 時刻)mf_token—hash_hmac( 'sha256', <uploads 相対パス> . '|' . <mf_expires>, <署名鍵> )
署名対象にファイルのパスと有効期限の両方を含めるため、トークンを他のファイルに流用することも、期限を書き換えて延命することもできません。照合はタイミング攻撃を避けるため hash_equals() で行います。署名鍵はデータベースに保存され、「すべての共有リンクを失効」で作り直されます(発行済みリンクが一斉に無効になります)。
WP-CLI コマンド
wp medifence status [--fresh] # 保護状態を表示(未保護なら終了コード 1)
wp medifence rewrite # .htaccess ルールを書き込む
wp medifence remove # ルールを削除して保護を無効化する
wp medifence verify # 日次点検と同じ検査・自動修復を実行する
wp medifence share <id> [--days=N] # 共有リンクを発行して URL を出力する
status は保護されていない場合に終了コードが 0 以外になるため、デプロイスクリプトや CI から保護状態を機械的に確認できます。--fresh はライブテストのキャッシュ(5 分)を無視して再検証します。
診断ヘッダー(X-Medifence)
Medifence が拒否した応答には X-Medifence: denied、プレースホルダー画像を配信した応答には X-Medifence: placeholder が付きます。このヘッダーが無い応答は Medifence を経由していないことを意味し、除外パス・除外拡張子・ルール欠落・mod_rewrite 無効・サーバー前段のキャッシュの切り分けに使えます。
.htaccess ルール
ルールは uploads ディレクトリの .htaccess に Medifence マーカーブロックとして書き込まれ、他のプラグインの記述は保持されます。内容は「.htaccess 自体の配信拒否 → 除外拡張子・除外パスの直接配信 → 既存ファイルへのリクエストをサイトの index.php?mf_file= へリライト」の順です(保護パス方式では、指定したパス配下のみをリライトします)。
WordPress は通常どおりブートストラップし、プラグインが init フック(priority 0)で認証確認とファイル配信を行います。WP コアのファイルを直接ロードすることはありません。無効化・アンインストールでブロックは除去され、通常配信に戻ります。生成されるルールの全文は設定画面の最下部で確認できます。
配信仕様
- ETag / 304 — パス・更新時刻・サイズから ETag を生成し、条件付きリクエストには本文なしの 304 を返します。ログイン済みユーザーのブラウザーキャッシュが効くため、PHP 配信のオーバーヘッドは繰り返し発生しません。
- Range 対応(206 / 416) — 動画・音声のシークに必要な部分リクエストに対応します。
Cache-Control: private— 共有キャッシュ(CDN・プロキシ)への保存を禁止します。認証済みユーザー向けに配信したファイルが匿名訪問者へ漏れることを防ぐための固定仕様です。- Content-Disposition — 画像・動画・音声・PDF・テキストのみインライン表示し、それ以外はダウンロード扱いにします(
X-Content-Type-Options: nosniff併用)。 - ストリーミング — 8KB チャンクで配信するため、大容量ファイルでもメモリを消費しません。
外部サービス
本プラグインは外部サービスと一切通信しません。設定画面のライブテストが送信する HTTP リクエストは自サイト宛ての 1 件のみです。