【问题标题】:Storing files under the root在根目录下存储文件
【发布时间】:2011-04-20 20:03:45
【问题描述】:

从我之前在这里的讨论中,我消除了将文件放在根目录下是安全的事实。我与为我处理此事的人交谈过,他说如果我们阻止公共访问,那么上传内容的用户将无法下载或查看他们的文件。给你一个我正在尝试做的例子:

如果我是网站的成员,我将一个 word 文件上传到我的帐户,那么我应该可以回来下载它。但是由于文件夹被阻止访问,那么如何下载文件呢?

【问题讨论】:

  • 如果您的意思是 webroot 之上,那么是的,它们是“安全的”,因为最终用户无法处理它们。

标签: php security file download document


【解决方案1】:

通常,您希望可下载的文件应位于文档根目录内或更深的位置。但是,如果您只想让文件在某些​​时候可下载(例如,您想首先检查用户凭据,或者在数据库中计算下载次数),您可以编写一个下载脚本。最简单的形式是:

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

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

<?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:在几乎所有具有 open_basedir 限制的共享主机上,受限目录实际上是公共文档根目录之上的一个目录。在这种情况下,它通常会起作用(因为用户无法在 open_basedir 中指定的目录之外的任何地方上传文件)。在 AAA 的情况下,它几乎可以保证工作。他的upload script is a PHP script。 PHP 可以在任何地方写入文件,readfile 将能够读取它,因为两者都使用相同的 open_basedir。
  • @AAA:您还需要使用 PHP 手动执行此操作。例如,通过处理glob的输出。
  • @Sander:在我这个时代,我见过一些托管商将 open_basedir 设置为 .,但你当然是对的,它在正确配置时会起作用,而且它会如果他能够写信到那个位置,确实可以工作。
  • @wimvds:哎呀。 . 的 open_basedir 相当,嗯……邪恶。如果我遇到这种情况,我会立即转移到另一个主机 :-)
【解决方案2】:

不经意间,您想要下载的文件应该存储在根目录或“之后”。通常,您不希望其他人直接访问的文件应存储在“根目录下”。这是因为如果您只需要包含这些文件,您可以轻松返回根目录并使用include()require() 获取它们,而用户隐藏它们,因为您的地址将显示为www.site.com/index.php

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

【讨论】:

  • 请详细说明,在根或之后是什么意思?我是新人请解释一下。谢谢
  • 或者用符号链接链接,然后告诉apache到follow sym links
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 2021-06-27
    • 2018-12-17
    • 1970-01-01
    相关资源
    最近更新 更多