我正在尝试弄清楚如何保护PHP中的数字下载。只需要一些一般的指示,这样我就可以开始我的研究。我似乎无法找到任何有用的东西。
我想让我的用户可以下载文件,但不希望他们能够直接访问下载文件夹。此外,我希望下载链接仅在设定的时间段或单次下载时可用。
有人能指出我正确的方向吗?
答案 0 :(得分:10)
最好的方法是将支票后的下载管理委托给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
打印内容
答案 1 :(得分:1)
只是一些示例:您可以将文件放在Web服务器的文档根目录之外,或者放在受.htaccess文件保护的目录中,并使用“全部拒绝”规则;然后通过自定义PHP函数传递文件,该函数设置正确的标题(mime-type,filesize等)并返回文件。
你可以创建基于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
答案 2 :(得分:0)
“Secure Download Links”,PHP脚本可用于隐藏下载URL或重命名下载文件,它可以选择存储在web根目录下以及存储在webroot上面的文件,也可以使用绝对的http URL。