我正在尝试弄清楚如何保护 PHP 中的数字下载。只需要一些大致的方向,这样我就可以开始我的研究了。我似乎找不到任何有用的东西。
我想让我的用户可以下载文件,但不希望他们能够直接访问下载文件夹。另外,我希望下载链接仅在设定的时间段或单次下载中可用。
有人能指出我正确的方向吗?
我正在尝试弄清楚如何保护 PHP 中的数字下载。只需要一些大致的方向,这样我就可以开始我的研究了。我似乎找不到任何有用的东西。
我想让我的用户可以下载文件,但不希望他们能够直接访问下载文件夹。另外,我希望下载链接仅在设定的时间段或单次下载中可用。
有人能指出我正确的方向吗?
最好的方法是在检查后将下载管理委托给 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
在登录检查后打印内容
只是一些例子:您可以将您的文件放在网络服务器的文档根目录之外,或者放在一个受“全部拒绝”规则的 .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
“安全下载链接”,一个 PHP 脚本可用于隐藏下载 url 或重命名下载文件,它可以选择存储在 web 根目录之下以及存储在 webroot 之上的文件也具有绝对 http url。