特に参考サイト等が見つからなかったので以下は妄想です。
・まずダウンロードさせるファイルは公開ディレクトリに置かない。もしくは.htaccess等で接続制限
(公開ディレクトリに置いている=公開している、です)
・ダウンロード直前のページでワンタイムトークンを発行、フォームに仕込む
・ダウンロードリンクは直接コンテンツではなくダウンロード用スクリプトに張る
・ダウンロード用スクリプトはワンタイムトークンをチェックしてOKだったらダウンロードさせる
index.php
- <?php
-
- $token=rand();
-
- file_put_contents('token.txt',$token,FILE_APPEND);
-
- print('
- <form method="POST" target="download.php">
- <input type="hidden" name="id" value="'.htmlspecialchars($id).'">
- <input type="hidden" name="token" value="'.htmlspecialchars($token).'">
- <input type="submit" name="submit" value="ダウンロードする">
- </form>
- ');
download.php
- <?php
-
- if(!in_array($_REQUEST['token'],file('token.txt')){
- die();
- }
-
-
-
-
- header("MP3のヘッダとか");
- readfile("MP3のファイル")
まあ、よくあるアップローダみたいな作りです。
上記は今適当に書いたのでワンタイムトークンの作り方が好い加減すぎたりtoken.txtが際限なく増えたり有効期限が無期限だったりそもそもtoken.txtが外から丸見えだったりしますがそこらへんはどうにかしてください。
どうせコンテンツを引っ張ってくるのにDBを使うことになると思いますのでDBに入れるとよいでしょう。
あとは、その他認証部分に
・ひとつのIPアドレスから同時に複数要求とかが来てたら死
・リファラが正しく入ってるかチェック
・一回ダウンロードしたらそのtokenは無効化
・レジューム要求とかが来たら200なり416なりを返す
・トークンを発行するついでにCookieも出してみる
あたりを好みで追加したりするといいかもしれません。
もっと強固にしたいなら、CAPTCHAでも付ければそこらのダウンロードツールでは太刀打ちできないでしょう。
#ここまで書いて、トークンはあんまり意味ねえなということに気がついた。
#JavaScript使ってトークンをDOMで追加とかはどうだろう。

shimix様、いつもわかりやすい説明をありがとうございます。 「includeはエディタでコピペした状態と同じ」 この表現、私も授業で使わせていただきたいと思います。