保护文件免受直接HTTP请求的影响

问题描述:

假设您的一些文件托管在您的网络服务器上,但您不希望它们被直接HTTP请求检索,因为这些文件是保密的。我们开始加密文件名,但我们希望它进一步进一步,那么将这些文件放在/ public_html文件夹之外,并让PHP从/ public_html之外的文件夹中检索所请求的文件呢?保护文件免受直接HTTP请求的影响

我想测试这个,但我的小脚本检索我错了文件名的0KB .pdf文件:

<?php 

$file = '/home/clientaccount/secretfiles/file.pdf'; 
if(!file_exists($file)){ 
    die('Error: File not found.'); 
} 
else 
{ 
    // Set headers 
    header("Cache-Control: public"); 
    header("Content-Description: File Transfer"); 
    header("Content-Disposition: attachment; filename=$file"); 
    header("Content-Type: application/pdf"); 
    header("Content-Transfer-Encoding: binary"); 
} ?> 
+0

你使用什么服务器?一个'.htaccess'文件可能更适合你。 – Lix 2012-07-07 13:44:26

+0

你在这之后回应文件的内容吗?或者是整个脚本? – 2012-07-07 13:46:26

+0

对不起,忘了添加细节:我们正在使用Apache。至于.htaccess,你可以精心设计你的想法吗?至于回声内容,这是整个脚本,因为我们不是要回显文件,而是强制文件被下载。 – Tobias 2012-07-07 13:53:23

要使代码正常工作,我不得不添加一个COMAND使PHP读取文件,并将其输出:

<?php 

$file = '/tmp/file.pdf'; 
if(!file_exists($file)){ 
    die('Error: File not found: '.$file); 
} 
else 
{ 

    // Set headers 
    header("Cache-Control: public"); 
    header("Content-Description: File Transfer"); 
    header("Content-Disposition: attachment; filename=$file"); 
    header("Content-Type: application/pdf"); 
    header("Content-Transfer-Encoding: binary"); 
    readfile($file); 
} 

?> 

否则我无法读取下载后的文件。

Hans Kuit表示,最好从文件名中删除路径。

+0

是的,只是试过这个,它的工作,和文件名必须重新命名为一个简单的字符串。谢谢大家的输入,一点点,所有贡献几乎是输出结果。谢谢大家:) – Tobias 2012-07-07 14:26:01

你有很多的右括号中如果,应该是:

if(!file_exists($file)){ 

这可能是服务器错误的原因,如果运行服务器的用户有权访问外部位置,您的代码应该可以正常工作。

+0

好吧,有人在我这里的脚下开枪......一个小错字扔500错误。问题已更新。谢谢user1498339 – Tobias 2012-07-07 13:58:41

+0

我试过了你的代码,它可以工作,但是我不得不把文件从我的主目录移动到/ tmp /,因为apache用户无法访问我的主目录中的文件。 – user1498339 2012-07-07 14:05:29

+0

对不起,它要求下载文件,但我不能读它(我没有检查这部分)。 – user1498339 2012-07-07 14:17:30

变量$ file只是一个字符串。到达您的访问者的标题告诉:

内容处置:附件; filename =/home/clientaccount/secretfiles/file.pdf

这不是访问者可以访问的文件夹。

+0

你必须确保Apache访问像@ user1498339提到的..还要确保你的头只包含文件名,而不是整个路径/到/// file.pdf – 2012-07-07 14:10:11

+0

我相信这也是正确的,会做的 – Tobias 2012-07-07 14:20:53