保护文件免受直接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");
} ?>
要使代码正常工作,我不得不添加一个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表示,最好从文件名中删除路径。
是的,只是试过这个,它的工作,和文件名必须重新命名为一个简单的字符串。谢谢大家的输入,一点点,所有贡献几乎是输出结果。谢谢大家:) – Tobias 2012-07-07 14:26:01
你有很多的右括号中如果,应该是:
if(!file_exists($file)){
这可能是服务器错误的原因,如果运行服务器的用户有权访问外部位置,您的代码应该可以正常工作。
好吧,有人在我这里的脚下开枪......一个小错字扔500错误。问题已更新。谢谢user1498339 – Tobias 2012-07-07 13:58:41
我试过了你的代码,它可以工作,但是我不得不把文件从我的主目录移动到/ tmp /,因为apache用户无法访问我的主目录中的文件。 – user1498339 2012-07-07 14:05:29
对不起,它要求下载文件,但我不能读它(我没有检查这部分)。 – user1498339 2012-07-07 14:17:30
变量$ file只是一个字符串。到达您的访问者的标题告诉:
内容处置:附件; filename =/home/clientaccount/secretfiles/file.pdf
这不是访问者可以访问的文件夹。
你必须确保Apache访问像@ user1498339提到的..还要确保你的头只包含文件名,而不是整个路径/到/// file.pdf – 2012-07-07 14:10:11
我相信这也是正确的,会做的 – Tobias 2012-07-07 14:20:53
你使用什么服务器?一个'.htaccess'文件可能更适合你。 – Lix 2012-07-07 13:44:26
你在这之后回应文件的内容吗?或者是整个脚本? – 2012-07-07 13:46:26
对不起,忘了添加细节:我们正在使用Apache。至于.htaccess,你可以精心设计你的想法吗?至于回声内容,这是整个脚本,因为我们不是要回显文件,而是强制文件被下载。 – Tobias 2012-07-07 13:53:23