PR

WordPressのパスワード保護ページのPDFを直接URLアクセスからブロックする方法

PDF直接アクセスをブロック .htaccessとfunctions.phpで実現するトークン認証 カスタマイズ
記事内に広告が含まれています。

PDFも画像もインターネット上にアップロードしている以上、Googleの画像検索などから誰でもアクセスできます。これは当たり前のことです。

ある日お客さんから連絡が来ました。

「パスワード保護したページにアップロードしたPDFが画像検索から見えている。個人情報が載っているので困る。」

理不尽・・・

そもそもインターネットにアップロードしている時点で特定の人だけに見せるのは難しいです。パスワード保護をしているから安全、そんなことはありません。

スクリーンショットを撮られてアップロードされたら防ぐ手段はありません。

でも怒られるのはいつもこちら側(現場で頑張る者たち)……ということで対策です。

セキュリティは簡易的ですが、インターネットの危険性を理解したうえで実装していきましょう。

この方法でできること

  • PDFへの直接URLアクセス制限
  • URL直打ち対策
  • 一部クローラーからの単純アクセス抑止
  • WordPress記事内リンクの自動トークン付与

この方法でできないこと

  • スクリーンショット防止
  • URL共有後のアクセス防止
  • 完全な閲覧制御
  • 高度なクローラー対策

やりたいこと

  • WordPressの記事にあるPDFリンクに自動でトークンを付ける
  • サーバー(.htaccess)がそのトークンが付いているアクセスだけ許可する
  • トークンなしの直接URLアクセスは403でブロック

functions.phpの設定

まずfunctions.phpにPDFリンクへ自動でトークンを付与するコードを追加します。

記事内のPDFリンクを自動で検出して?token=abc123を付け加えます。すでにクエリパラメータがある場合は&token=abc123として付与します。

functions.phpに記述
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が表示されます。

WordPressの記事上でPDFリンクに自動でトークンが付与されている画面

.htaccessの設定

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

FFFTPで/wp-content/uploadsディレクトリ内の.htaccessファイルを確認している画面

以下のコードを追加します。

.htaccessに記述
<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が閲覧できません。

トークンなしでアクセスすると403エラーが表示されPDFが閲覧できない画面

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

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

注意点

このトークンは固定の文字列です。abc123のままは使わず、推測されにくい文字列に変更してください。

またトークンがURLに含まれるため、URLを直接共有された場合はアクセスできてしまいます。完全なセキュリティではなく、検索エンジンやURL直打ちからのブロックが目的です。

まとめ

インターネットにアップロードしたファイルは基本的に誰でもアクセスできます。

今回の方法で簡易的ではありますが、直接URLでのアクセスや、検索エンジン経由での単純な閲覧を抑止する効果が期待できます。ただし完全な防御ではありません。

サーバー側で処理が必要なため.htaccessの修正は免れませんが、個人情報を気にするお客さんに遭遇した際にぜひ参考にしてください。

参考リンク

本記事の実装は、以下の記事を参考にしつつ、WordPress記事本文内のPDFリンクへ自動でトークンを付与する形に調整しています。

参考元:https://www.uchiwa-design.net/web-tips/1216/

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