PHPでデジタルダウンロードを保護する方法を見つけようとしています。調査を開始できるように、一般的な指示が必要です。有用なものを見つけることができないようです。
ユーザーがファイルをダウンロードできるようにしたいが、ダウンロード フォルダーに直接アクセスできないようにしたい。また、ダウンロード リンクを一定期間または 1 回のダウンロードのみ利用できるようにしたい。
誰かが私を正しい方向に向けることができますか?
PHPでデジタルダウンロードを保護する方法を見つけようとしています。調査を開始できるように、一般的な指示が必要です。有用なものを見つけることができないようです。
ユーザーがファイルをダウンロードできるようにしたいが、ダウンロード フォルダーに直接アクセスできないようにしたい。また、ダウンロード リンクを一定期間または 1 回のダウンロードのみ利用できるようにしたい。
誰かが私を正しい方向に向けることができますか?
最善の方法は、チェック後にダウンロード管理を apache の mod に委任することです
x_sendfile
https://tn123.org/mod_xsendfile/
使用法:
<?php
...
if ($user->isLoggedIn())
{
header("X-Sendfile: $path_to_somefile");
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"$somefile\"");
exit;
}
?>
<h1>Permission denied</h1>
<p>Login first!</p>
基本的に、ヘッダー X-Sendfile を送信すると、mod がファイルをインターセプトし、ダウンロードを管理します (ファイルは仮想ホストの外にいつでも配置できます)。
それ以外の場合は、単純なファイル download.php を実装して、ファイルの ID を取得しreadfile
、ログイン チェック後に内容を出力することができます。
いくつかの例: Web サーバーのドキュメント ルートの外にファイルを配置したり、「すべて拒否」ルールを使用して .htaccess ファイルで保護されたディレクトリにファイルを配置したりできます。次に、正しいヘッダー (MIME タイプ、ファイルサイズなど) を設定してファイルを返すカスタム PHP 関数によってファイルを配信します。
MD5 または SHA1 ハッシュに基づいた一意の ID を持つリンクを作成できます。mod_rewrite ルールは ID を PHP ファイルにポイントし、データベースで ID を検索し、次のように時間チェックを行います。
example.com/downloads/73637/a8d157edafc60776d80b6141c877bc6b
に書き換えられます
example.com/dl.php?id=a8d157edafc60776d80b6141c877bc6b&file=73637
以下は、nginx と PHP で必要なことを行う例です: http://wiki.nginx.org/HttpSecureLinkModule