我原来的答案:
您将需要存储(在数据库或会话变量中)用户可以访问的项目,您将为每个项目生成一个唯一的随机令牌。该令牌将用于识别购买的物品。将令牌传递到他们将能够下载的页面(在会话变量、POST 参数中,或者作为 url 中的最后一个选项,即 GET)。在您需要下载的页面中,您将使用会话信息查询数据库/会话变量,以识别客户和传递的令牌(但是您传递了它)并检索要下载的文件。
如果您需要保留已购买项目的列表以供重新下载,您也可以这样做,但请记住在用户请求下载时再次创建令牌。如果您愿意,还可以添加到期日期。
现在我已经提到了几个替代方案,然后再次根据引用答案的性质,我想您将需要更多详细信息来说明如何做到这一点。
也许 ernie 是对的,我不应该假设你有一个会话。也许我应该告诉你如何做一个会话。
所以我将采取其中一种实现方式,最简单的方式。
<?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(或您的主机提供的其他机制)保护它们的主机。
评论这个解决方案:
它简单,易于实施。然而它也有一些缺点:
- 如果会话在下载之前终止,则用户将损失金钱*。
- 没有明确的方法实现重新下载。
- 它仍然容易受到会话劫持(我知道,这很牵强,但最好是安全的)。
*:假设连接丢失,并且会话在客户端过期。哦,不,我们不需要满意的客户。
所以,你真的,真的,需要用数据库备份它并创建随机令牌,最好有一个到期日期。