2011-04-20 86 views
1

从我以前的讨论中,我拿走了文件如果放在根目录下是安全的事实。我与为我处理这个问题的人交谈过,他说如果我们阻止公众访问,那么上传内容的用户将无法下载或查看他们的文件。给你一个我想要做的例子:在根目录下存储文件

如果我,网站的成员上传到我的帐户一个word文件,那么我应该能够回来并下载它。但是因为该文件夹阻止访问,文件如何被下载?

+1

如果你的意思是上面的webroot,那么他们是“安全”的,因为它们不能被最终用户解决。 – 2011-04-20 12:05:41

回答

2

通常情况下,您想要下载的文件应位于文档根目录或其中更深的位置。但是,如果您只想在某些时间下载文件(例如,您想首先检查用户凭证,或者计算数据库中的下载次数),则可以编写下载脚本。最简单的形式会是这样的:

<?php 
header('Content-Disposition: attachment;filename=hello.txt'); 
readfile('/path/to/file.txt'); 
?> 

注意有使用特殊的Apache模块称为xsendfile更好的方法。就这样,你可以做这样的事情:

<?php 
header('Content-Disposition: attachment;filename=hello.txt'); 
header('X-Sendfile: /path/to/file.txt'); 
?> 

Apache会看到第二个头部,剥离它,并发送file.txt的内容。好的是你的资源密集型PHP脚本已经停止了,你不会遇到任何类型的PHP时间或内存限制。

+0

+1对于良好和完整的文章(使用mod_xsendfile确实是apache的一个很好的解决方案)。然而,您应该注意,第一种方法可能无法在托管open_basedir限制时生效...... – wimvds 2011-04-20 12:11:32

+1

@wimvds:在几乎所有与open_basedir限制共享的主机上,受限制的目录实际上是公共文档根目录之上的一个目录。在这种情况下,它通常会工作(因为用户无法将文件上传到open_basedir指定的目录之外的任何地方)。在AAA的情况下,它几乎可以保证工作。他的[上传脚本是一个PHP脚本](http://stackoverflow.com/questions/5670142/what-are-some-security-holes-a-website-is-exposed-through-document-upload)。任何PHP都可以编写一个文件,'readfile'将能够读取它,因为它们都使用相同的open_basedir。 – 2011-04-20 12:24:40

+0

我如何能够看到该文件夹​​中是否有文件,我现在已经安装了它,但是我无法在根目录下看到该文件夹​​。我错过了什么吗? – AAA 2011-04-20 13:08:44

1

你想要下载的文件应该存储在根目录或“之后”。通常你不希望别人直接访问的文件应该存储在“根目录下”。这是因为如果你需要这些文件只是包括在内,你可以很容易地回到根目录并获得他们的include()require(),而他们被用户隐藏,因为你的地址将显示为www.site.com/index.php

必须公开并需要公共访问的文件(例如:下载)不能存储在“根目录下”。

+0

请elaborte,你是什么意思在根或以后?我是新的请解释。谢谢 – AAA 2011-04-20 11:59:34

+0

或链接到一个符号链接,然后告诉Apache [遵循sym链接](http://www.maxi-pedia.com/FollowSymLinks) – Rudie 2011-04-20 11:59:34

+1

@AAA更新... – Shoe 2011-04-20 12:00:37

1

您可以直接从PHP脚本直接传递文件给用户。你需要fpassthru函数。但是这个解决方案并不完美并导致问题。我最好是让你可以下载的文件放在公开访问的目录(文档根目录或子目录中的某处)。或者你可以从子域服务他们(甚至更好)。

相关问题