ドキュメント

テーマやプラグインから 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] [--format=json]   # 保護状態を表示(未保護なら終了コード 1)
wp medifence verify                             # 日次点検と同じ検査・自動修復を実行する
wp medifence rewrite / remove                   # .htaccess ルールを書き込む / 削除する
wp medifence inspect <file> [--format=json]     # 1 ファイルの判定と理由を表示する
wp medifence audit [--limit=N] [--format=…]     # ライブラリを走査し、誰でも開けるファイルを一覧する
wp medifence stray [--limit=N] [--format=…]     # 添付が指していないファイルを走査する
wp medifence share <id> [--days=N] [--uses=N] [--label=…] [--password=…]
wp medifence log [--clear] / history [--clear]  # アクセスログ / 設定変更の履歴
wp medifence override <id> <mode>              # ファイル単位の例外を設定する
wp medifence pause [--minutes=N] / resume       # 保護を一時停止する / 再開する
wp medifence export / import <file> [--dry-run] # 設定を書き出す / 読み込む

status は保護されていない場合に終了コードが 0 以外になるため、デプロイスクリプトや CI から機械的に確認できます。--fresh はライブテストのキャッシュ(5 分)を無視して再検証し、--format=json はレポート全体を 1 つの JSON オブジェクトで出力します(終了コードは変わりません)。

診断ヘッダー(X-Medifence)

Medifence が応答を決めたときは X-Medifence ヘッダーが付きます。値は denied(拒否)・placeholder(代替画像)・login(ログイン画面へ誘導)・page(任意のページへ誘導)・password(共有リンクのパスワード入力)・paused(一時停止中)。このヘッダーが無い応答は Medifence を経由していないことを意味し、除外パス・除外拡張子・ルール欠落・mod_rewrite 無効・サーバー前段のキャッシュの切り分けに使えます。

ショートコード([medifence_files])

[medifence_files path="members/gold"] は、その uploads フォルダーのファイルのうちそのページを見ている訪問者が実際にダウンロードできるものだけを一覧します。判定は配信そのものと同じ順序(ファイル単位の例外 → 除外 → 公開サイズ → 保護範囲 → 権限)で行い、medifence_allow_access フィルターも通ります。出力はクラス名だけを持つリスト 1 つで、装飾はテーマに任せます。訪問者によって内容が変わるため、このページはページキャッシュに載せないでください(プラグインは DONOTCACHEPAGE を定義します)。

REST と定数

メディアの REST エンドポイント wp/v2/media には読み取り専用の medifence フィールドが付き、protected / reason / description を返します。返るのは manage_options を持つ呼び出しにだけで、それ以外には null です(どのファイルが到達可能かという情報自体が情報だからです)。wp-config.php で MEDIFENCE_LOCK_SETTINGS を真にすると、保護範囲を動かす操作が管理画面でも WP-CLI でも拒否されます(診断・監査・共有リンクは使えたまま)。日次の露出カウントが調べる件数は medifence_exposure_limit フィルターで変えられます。

.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 件のみです。

← ホームに戻る

タイトルとURLをコピーしました