防止共享下载 URL
Prevent download URLs from being shared
问题
当我向用户提供下载时,我不希望他们能够复制 URL 并与他人共享。更进一步:我只想提供一次下载。如果他们第二次访问 URL,我想抛出 404。
问题
我怎样才能阻止用户第二次访问下载 URL 并且这个方法是完全有效的。
附加信息
我目前按如下方式提供我的文件:
header("Content-type: application/pdf");
// Set the name of the downloaded file here:
header("Content-Disposition: attachment;filename='example.pdf'");
// Get the contents of the original file:
echo file_get_contents('example.pdf');
我还在我的 mysql 数据库中添加了一个 table
+----+------+-------+------+
| downloads |
+----+------+-------+------+
| id | file | token | flag |
+----+------+-------+------+
您需要使用重定向到文件的下载脚本。在重定向到文件之前,脚本需要通过唯一令牌(存储在数据库中)验证 url。该脚本可以记录已经进行的下载并在数据库中设置一个标志。检查标志以防止将来下载。
编辑:这是一个示例(带有伪代码):
if( isset($_GET["token"]) && !empty($_GET["token"]) )
{
//verify $_GET["token"] matches a token in the db
//verify that the download flag has not been set
header("Content-type: application/pdf");
// Set the name of the downloaded file here:
header("Content-Disposition: attachment;filename='example.pdf'");
//set the downloaded flag in the database so that this file can't be downloaded again
// Get the contents of the original file:
echo file_get_contents('example.pdf');
}
else
header("HTTP/1.0 404 Not Found");
只需将下载计数器字段添加到您的 table 并根据下载计数生成唯一的 URL。
每次有人尝试下载文件时,您都会将数据库中的计数器增加 +1。
他们第二次打开下载 URL 他们没有到达相同的 URL。你现在有一个下载计数器。
如果您想阻止共享所提供的 URL。所以用户根本没有下载文件,您可能需要创建第二个 table 来存储用户 ID 和文件 ID。
我想我可能已经在@Ben-JD 的回答的帮助下找到了解决方法。我试着说清楚,以防其他人遇到同样的问题。
第一步 - 创建 table
+----+------+-------+------+
| downloads |
+----+------+-------+------+
| id | file | token | flag |
+----+------+-------+------+
CREATE TABLE IF NOT EXISTS `downloads` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`file` varchar(255) NOT NULL,
`token` varchar(255) NOT NULL,
`flags` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
第二步 - 准备下载
当用户点击下载时link:
- 使用 uniqid() 生成令牌
将文件名和令牌插入下载 table
$token = uniqid();
$文件名 = 'download.pdf';
// 使用您喜欢的方法进行查询
// INSERT INTO downloads (file, token, flags) VALUES ('".$filename."', '".$token."', 0);
第三步 - 下载
现在执行以下操作:
- 重定向到下载页面(例如 download.php)并将文件名和令牌作为 GET 参数传递
- 检查文件名和相应的令牌是否在您的数据库中
提供文件
header("Location: download.php?file=".$filename."&token=".$token);
download.php:
// SELECT filename FROM downloads WHERE filename='".$filename."' AND token='".$token."' AND flags=0;
如果该查询没有 return 结果,您可以报错。否则,return 使用您的代码下载
header("Content-type: application/pdf");
header("Content-Disposition: attachment;filename='".$filename."'");
echo file_get_contents($filename);
问题
当我向用户提供下载时,我不希望他们能够复制 URL 并与他人共享。更进一步:我只想提供一次下载。如果他们第二次访问 URL,我想抛出 404。
问题
我怎样才能阻止用户第二次访问下载 URL 并且这个方法是完全有效的。
附加信息
我目前按如下方式提供我的文件:
header("Content-type: application/pdf");
// Set the name of the downloaded file here:
header("Content-Disposition: attachment;filename='example.pdf'");
// Get the contents of the original file:
echo file_get_contents('example.pdf');
我还在我的 mysql 数据库中添加了一个 table
+----+------+-------+------+
| downloads |
+----+------+-------+------+
| id | file | token | flag |
+----+------+-------+------+
您需要使用重定向到文件的下载脚本。在重定向到文件之前,脚本需要通过唯一令牌(存储在数据库中)验证 url。该脚本可以记录已经进行的下载并在数据库中设置一个标志。检查标志以防止将来下载。
编辑:这是一个示例(带有伪代码):
if( isset($_GET["token"]) && !empty($_GET["token"]) )
{
//verify $_GET["token"] matches a token in the db
//verify that the download flag has not been set
header("Content-type: application/pdf");
// Set the name of the downloaded file here:
header("Content-Disposition: attachment;filename='example.pdf'");
//set the downloaded flag in the database so that this file can't be downloaded again
// Get the contents of the original file:
echo file_get_contents('example.pdf');
}
else
header("HTTP/1.0 404 Not Found");
只需将下载计数器字段添加到您的 table 并根据下载计数生成唯一的 URL。
每次有人尝试下载文件时,您都会将数据库中的计数器增加 +1。
他们第二次打开下载 URL 他们没有到达相同的 URL。你现在有一个下载计数器。
如果您想阻止共享所提供的 URL。所以用户根本没有下载文件,您可能需要创建第二个 table 来存储用户 ID 和文件 ID。
我想我可能已经在@Ben-JD 的回答的帮助下找到了解决方法。我试着说清楚,以防其他人遇到同样的问题。
第一步 - 创建 table
+----+------+-------+------+
| downloads |
+----+------+-------+------+
| id | file | token | flag |
+----+------+-------+------+
CREATE TABLE IF NOT EXISTS `downloads` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`file` varchar(255) NOT NULL,
`token` varchar(255) NOT NULL,
`flags` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
第二步 - 准备下载
当用户点击下载时link:
- 使用 uniqid() 生成令牌
将文件名和令牌插入下载 table
$token = uniqid(); $文件名 = 'download.pdf';
// 使用您喜欢的方法进行查询 // INSERT INTO downloads (file, token, flags) VALUES ('".$filename."', '".$token."', 0);
第三步 - 下载
现在执行以下操作:
- 重定向到下载页面(例如 download.php)并将文件名和令牌作为 GET 参数传递
- 检查文件名和相应的令牌是否在您的数据库中
提供文件
header("Location: download.php?file=".$filename."&token=".$token);
download.php:
// SELECT filename FROM downloads WHERE filename='".$filename."' AND token='".$token."' AND flags=0;
如果该查询没有 return 结果,您可以报错。否则,return 使用您的代码下载
header("Content-type: application/pdf");
header("Content-Disposition: attachment;filename='".$filename."'");
echo file_get_contents($filename);