【问题标题】:PHP - Protecting digital DownloadsPHP - 保护数字下载
【发布时间】:2011-03-23 22:16:48
【问题描述】:

我正在尝试找出如何保护 PHP 中的数字下载。只需要一些大致的方向,这样我就可以开始我的研究了。我似乎找不到任何有用的东西。

我想让我的用户可以下载文件,但不希望他们能够直接访问下载文件夹。另外,我希望下载链接仅在设定的时间段内或单次下载时可用。

有人能指出我正确的方向吗?

【问题讨论】:

  • <rant>相对于analog 下载?</rant>@usniorg,你能告诉我们你使用什么网络服务器软件吗?它会影响答案。
  • 将文件存储在 Web 根目录之外,通过脚本提供服务
  • @BoltClock,您的意思是实际将文件存储在数据库中?这是一个好主意吗?抱歉,我不确定你的意思。

标签: php download download-manager


【解决方案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打印内容

【讨论】:

  • 值得注意的是,X-Sendfile 支持也可用于 nginx 和 lighttpd(这是它的起源),如果您可以使用,它是最佳选择
【解决方案2】:

只是一些示例:您可以将文件放在网络服务器的文档根目录之外,或者放在受“全部拒绝”规则的 .htaccess 文件保护的目录中;然后您通过自定义 PHP 函数传递文件,该函数设置正确的标题(mime 类型、文件大小等)并返回文件。

您可以基于 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

【讨论】:

    【解决方案3】:

    Secure Download Links”,一个 PHP 脚本可用于隐藏下载 url 或重命名下载文件,它可以选择存储在 web 根目录下以及存储在 webroot 上的文件,也可以使用绝对 http url。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-15
      • 2012-09-26
      • 1970-01-01
      • 1970-01-01
      • 2020-08-01
      相关资源
      最近更新 更多