PDFも画像もインターネット上にアップロードしている以上、Googleの画像検索などから誰でもアクセスできます。これは当たり前のことです。
ある日お客さんから連絡が来ました。
「パスワード保護したページにアップロードしたPDFが画像検索から見えている。個人情報が載っているので困る。」

理不尽・・・
そもそもインターネットにアップロードしている時点で特定の人だけに見せるのは難しいです。パスワード保護をしているから安全、そんなことはありません。
スクリーンショットを撮られてアップロードされたら防ぐ手段はありません。
でも怒られるのはいつもこちら側(現場で頑張る者たち)……ということで対策です。
セキュリティは簡易的ですが、インターネットの危険性を理解したうえで実装していきましょう。
やりたいこと
- WordPressの記事にあるPDFリンクに自動でトークンを付ける
- サーバー(.htaccess)がそのトークンが付いているアクセスだけ許可する
- トークンなしの直接URLアクセスは403でブロック
functions.phpの設定
まずfunctions.phpにPDFリンクへ自動でトークンを付与するコードを追加します。
記事内のPDFリンクを自動で検出して?token=abc123を付け加えます。すでにクエリパラメータがある場合は&token=abc123として付与します。
function add_token_to_pdf_links($content) {
$token = 'abc123'; // .htaccess で使っているトークンと一致させる
$pattern = '/(href=["\'])([^"\']+\.pdf)(["\'])/i';
$content = preg_replace_callback($pattern, function ($matches) use ($token) {
$url = $matches[2];
if (strpos($url, '?') !== false) {
$url .= '&token=' . $token;
} else {
$url .= '?token=' . $token;
}
return $matches[1] . $url . $matches[3];
}, $content);
return $content;
}
add_filter('the_content', 'add_token_to_pdf_links');
記事のPDFリンクにカーソルを合わせると、ステータスバーに自動でトークンが付いたURLが表示されます。

.htaccessの設定
次に/wp-content/uploads/ディレクトリの中にある.htaccessをFFFTPなどのFTPソフトで開いて編集します。

以下のコードを追加します。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_URI} \.pdf$ [NC]
RewriteCond %{QUERY_STRING} !(^|&)token=abc123(&|$)
RewriteRule \.pdf$ - [F,L]
</IfModule>
token=abc123の部分はfunctions.phpで設定したトークンと必ず一致させてください。
動作確認
トークンなしでPDFのURLに直接アクセスすると403エラーが表示されてPDFが閲覧できません。

トークン付きのURLでアクセスするとPDFが正常に表示されます。

注意点
このトークンは固定の文字列です。abc123のままは使わず、推測されにくい文字列に変更してください。
またトークンがURLに含まれるため、URLを直接共有された場合はアクセスできてしまいます。完全なセキュリティではなく、検索エンジンやURL直打ちからのブロックが目的です。
まとめ
インターネットにアップロードしたファイルは基本的に誰でもアクセスできます。
今回の方法で簡易的ではありますが、直接URLでのアクセスや、検索エンジン経由での単純な閲覧を抑止する効果が期待できます。ただし完全な防御ではありません。
サーバー側で処理が必要なため.htaccessの修正は免れませんが、個人情報を気にするお客さんに遭遇した際にぜひ参考にしてください。
参考リンク
本記事の実装は、以下の記事を参考にしつつ、WordPress記事本文内のPDFリンクへ自動でトークンを付与する形に調整しています。

