【问题标题】:Secure downloads without authentication无需身份验证即可安全下载
【发布时间】:2013-07-12 17:57:32
【问题描述】:

我想创建临时链接以防止直接下载文件。

流程应该是这样的:

用户购买文件,仅指明电子邮件地址 -> 向该地址发送一封电子邮件,其中包含购买的临时文件的 url。

我希望这个网址只能使用 3 次。

我该怎么做? 在 apache 服务器上使用 Symfony2。

对于这个极其含糊的要求,我深表歉意,但我快失明了,我不知道要寻找什么方法。

【问题讨论】:

  • 您可以保护数据库中的 url。并统计该url在数据库中存在的次数。

标签: php apache mod-rewrite symfony


【解决方案1】:

生成一个随机key,制作一个mysql表,其中包含fileid、key、number_of_downloads。

每次用户单击指向http://www.yourdomain.com/getfile.php?file=blah&key=blahblah 的链接时,您都可以更新表 number_of_downloads。如果小于 2,则重定向到文件(使用 php 标头或 symphony 的重定向),如果大于 2,则给出 404 或其他...

【讨论】:

  • 我不建议重定向到该文件,因为这意味着该文件将是公开可用的(因此不是特别安全)。相反,将文件放在文档根目录之外,并让下载页面回显文件的内容。您必须确保该文件是唯一回显的内容(没有 HTML),并且您必须发送内容类型(类似于 header("Content-Type: application/octet-stream").
【解决方案2】:

应该很简单(虽然我对 Symfony2 了解不多)。您将有一个下载页面,其中包含一个“密钥”参数(可能是/download?key=blahblahblah)。创建一个数据库(或其他类型的存储),每当您需要生成下载链接时,让您的代码组成一个密钥并将其存储在数据库中。每个密钥还可以附加一个数字,以表示它仍然可以使用的次数,或者一个到期时间。下载页面将确保密钥仍然有效,如果有效,则提供文件。

编辑:这是通过 PHP 脚本提供文件的示例:

// this may need to change depending on the file type
header("Content-Type: application/octet-stream");
// this makes sure the downloaded file doesn't get named "download.php"
header("Content-Disposition: attachment; filename=stuff.zip");
// and this sends the file
echo file_get_contents("/path/to/stuff.zip");

再次编辑:实际上,this 可能是更好的方法。

【讨论】:

    猜你喜欢
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 2017-03-04
    • 1970-01-01
    相关资源
    最近更新 更多