私の最初の答え:
ユーザーがアクセスできるアイテムを(データベースまたはセッション変数に)格納する必要があります。各アイテムに対して、一意のランダムトークンを生成します。そのトークンは、購入したアイテムを識別するために使用されます。ダウンロードできるページにトークンを渡します(セッション変数、POST引数、またはURLの最後のオプションとしてGET)。ダウンロードする必要があるページでは、セッション情報を使用してデータベース/セッション変数を照会し、顧客と渡されたトークン(ただし、渡したトークン)を識別し、それを使用してダウンロードするファイルを取得します。
再ダウンロードのために購入したアイテムのリストを保持する必要がある場合は、それも可能ですが、ユーザーがダウンロードを要求したときにトークンを再度作成することを忘れないでください。必要に応じて、有効期限を追加することもできます。
ここで、いくつかの選択肢について説明しましたが、引用された回答の性質から、その方法についてさらに詳しく説明する必要があると思います。
アーニーが正しいかもしれません、そして私はあなたがセッションを持っていると仮定するべきではありません。セッションのやり方をお見せしたほうがいいかもしれません。
そこで、実装のオプションの1つである、最も単純なオプションを取り上げます。
<?php
//Oh, I'm in a PHP page...
//check if there is not a session
if (session_id() != '')
{
//Ok, there is no session, let's create one
session_start();
}
//Now we are sure there is a session
//Let's store in the session the id of the file I want to allow to download
$_SESSION['download'] = GetFileId();
//GetFileId will do some mambo jambo expecto patronum to return an id
//The id will be 38a205ec300a3874c867b9db25f47c61 or something
?>
今ダウンロードページで....
<?php
//Oh, I'm in another PHP page...
//check if there is not a session
if (session_id() != '')
{
//no session? screw you, no download for you
header('Location: sorry.php');
}
else
{
//Now we are sure there is a session
//Let's get from the session the id of the file I want to allow to download
$id = $_SESSION['download'];
//Now get the url to redirect to allow the download
$url = GetUrl($id);
//GetUrl will do some mambo jambo expecto patronum to return an url
//Ok, now we are going to return that file...
//So put the correct MIME type
header('content-type: image/gif'); //if it is a gif...
//Load the file
$contents = file_get_contents($url);
echo $contents;
//That's the only output
exit();
}
?>
PHPからのみファイルへのアクセスを許可していることに注意してください。これにより、ユーザーがアクセス権を持っているかどうかを最初に確認できます。ユーザーがURLを入力して(推測できない場合でも)ファイルにアクセスすることを許可しないでください。したがって、サーバーを実行している場合は、それらのファイルをサーバーのWebフォルダーの外に配置するか、ホスティングを使用している場合は、.htaccess(またはホスティングが提供する別のメカニズム)でファイルを保護します。
このソリューションについてのコメント:
シンプルで実装も簡単です。しかし、いくつかの欠点があります。
- ダウンロード前にセッションが終了した場合、ユーザーはお金を失いました*。
- 再ダウンロードを実装する明確な方法はありません。
- それはまだセッションハイジャックに対して脆弱です(私は知っていますが、はるかにフェッチされますが、より安全です)。
*:接続が失われ、クライアントでセッションが期限切れになったとします。ああ、いや、私たちは幸せな顧客を必要としない。
したがって、実際には、これをデータベースでバックアップし、できれば有効期限付きのランダムトークンを作成する必要があります。