从我以前的讨论中,我拿走了文件如果放在根目录下是安全的事实。我与为我处理这个问题的人交谈过,他说如果我们阻止公众访问,那么上传内容的用户将无法下载或查看他们的文件。给你一个我想要做的例子:在根目录下存储文件
如果我,网站的成员上传到我的帐户一个word文件,那么我应该能够回来并下载它。但是因为该文件夹阻止访问,文件如何被下载?
从我以前的讨论中,我拿走了文件如果放在根目录下是安全的事实。我与为我处理这个问题的人交谈过,他说如果我们阻止公众访问,那么上传内容的用户将无法下载或查看他们的文件。给你一个我想要做的例子:在根目录下存储文件
如果我,网站的成员上传到我的帐户一个word文件,那么我应该能够回来并下载它。但是因为该文件夹阻止访问,文件如何被下载?
通常情况下,您想要下载的文件应位于文档根目录或其中更深的位置。但是,如果您只想在某些时间下载文件(例如,您想首先检查用户凭证,或者计算数据库中的下载次数),则可以编写下载脚本。最简单的形式会是这样的:
<?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时间或内存限制。
+1对于良好和完整的文章(使用mod_xsendfile确实是apache的一个很好的解决方案)。然而,您应该注意,第一种方法可能无法在托管open_basedir限制时生效...... – wimvds 2011-04-20 12:11:32
@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
我如何能够看到该文件夹中是否有文件,我现在已经安装了它,但是我无法在根目录下看到该文件夹。我错过了什么吗? – AAA 2011-04-20 13:08:44
你想要下载的文件应该存储在根目录或“之后”。通常你不希望别人直接访问的文件应该存储在“根目录下”。这是因为如果你需要这些文件只是包括在内,你可以很容易地回到根目录并获得他们的include()
或require()
,而他们被用户隐藏,因为你的地址将显示为www.site.com/index.php
。
必须公开并需要公共访问的文件(例如:下载)不能存储在“根目录下”。
您可以直接从PHP脚本直接传递文件给用户。你需要fpassthru函数。但是这个解决方案并不完美并导致问题。我最好是让你可以下载的文件放在公开访问的目录(文档根目录或子目录中的某处)。或者你可以从子域服务他们(甚至更好)。
如果你的意思是上面的webroot,那么他们是“安全”的,因为它们不能被最终用户解决。 – 2011-04-20 12:05:41