使用PHP控制对文件系统的访问

时间:2010-09-20 20:36:01

标签: php permissions

我之前发布在这里:

Controlling Access for Trial Subscription

由于这是一个基于建议的新问题,我想我应该开始一个新帖子。如果这应该是一个编辑,请让我知道将来。

我认为我要控制访问的解决方案是上传文件并散列名称。该文件的格式为:

/上传/ #############。PDF

将向订阅者发送链接。他们第一次来到网站时,他们会被要求创建一个“pin”和一个“提示”来记住。然后,可以访问目标网页,通过电子邮件地址/图钉组合列出他们的项目。

我的问题是:我知道我可以控制对页面的访问,显示他们可以查看哪些项目,但有没有办法控制/ uploads / [file]只能在某种程序化后下载校验?我想不出有什么方法可以做到这一点......

再次感谢。 D.

1 个答案:

答案 0 :(得分:1)

您的pdf文件不必位于用户可查看的目录中。它们可以位于您的Web根目录之外。这样,没有人可以实际浏览到www.yoursite.ext/uploads/2395wrfhgt.pdf自己下载或与他人共享链接。

为了下载pdf,你将拥有一个专用脚本,它将对请求它的用户进行所有访问检查,如果一切正常,它将设置相应的头文件,从文件系统中读取文件,然后打印它给用户。

因此,假设您的网站位于/var/www/site/htdocs/,并且您将每个pdf上传到/var/www/site/uploads/。您甚至不需要对文件名进行哈希处理,而是可以保持它们的名称,以便于组织。

然后,所有下载文件的链接都将指向www.yoursite.ext/download.php?id={fileid}

您的download.php将执行所有访问检查(正确登录,有权下载文件等),然后执行以下操作:

$pathToPdf = '/var/www/site/uploads/some.pdf' ;

header('Content-Type: application/pdf');
header('Content-Length: ' . filesize($pathToPdf));
header('Content-Disposition: attachment; filename=' . 'some.pdf');

readfile($pathToPdf) ;

这就是它。一旦你开始工作,你可以考虑改进一些事情:

  • 使用mod_rewrite或类似文件在链接中包含实际的pdf文件名,这有助于某些浏览器意识到应该下载它:www.yoursite.ext / download / {fileid} .pdf
  • 考虑使用Web服务器而不是php来提供文件,例如X-Sendfile header