【问题标题】:php folders and files permissionsphp文件夹和文件权限
【发布时间】:2012-01-06 01:17:34
【问题描述】:

我对文件夹和文件权限的工作方式有一些疑问。假设我在“受保护”之外有用户目录,如下所示..

users
  -- usera
    -- docs
  -- userb
    -- docs
protected

我不希望没有权限的用户 B 访问用户 A 目录中的任何内容。另外,我不希望任何人通过 url 链接访问目录目录。基本上我只是希望用户能够访问他们自己的目录,而不是其他人。怎么办?

谢谢!

【问题讨论】:

  • 这需要更多上下文。怎么访问? “protected”的相关性是什么?
  • 以读取或下载文件的方式访问。 protected 是一个包含 .htaccess 'deny from all' 的目录,用于托管 php 脚本。
  • 这仍然有点令人困惑,因为您谈论“权限”,这通常是文件系统的事情。通过网络服务器访问文件时,您似乎在谈论更抽象的权限,或者您是吗?
  • 抱歉给您带来了困惑。我指的是身份验证中的权限。经过身份验证的用户应该只能访问他的文件和文件夹。同样,任何网络用户都不能通过 url 访问任何用户的文件/文件夹。

标签: php file permissions directory


【解决方案1】:

如果没有更多信息,我的建议是确保用户目录位于 Web 根目录之上。这将防止它们被链接到。然后创建一个 PHP 脚本来验证用户是他们所说的那个人。知道登录用户的身份后,您可以使用 fpassthru() (http://php.net/fpassthru) 或类似方法将文档传递给用户。

【讨论】:

  • 嗨,还需要什么其他信息?还有其他方法吗,因为我认为使用 passthr 会给服务器带来很多处理负担?
  • 在 fpassthru PHP 页面上有一些与速度和服务器资源使用有关的有趣的 cmets。使用 fread 实际上可能更快。您应该浏览该页面上的 cmets 以获得一些好的提示。如果不想使用 PHP 函数,可以查看 mod-auth-token code.google.com/p/mod-auth-token
  • mod-auth-token 看起来不错!但我不能在共享主机上得到这个?
  • 在共享主机上,您最好的选择可能是 fread 或 fpassthru。您可能能够在您自己生成随机令牌的地方获得一些工作,然后写入用户目录中的 htaccess 文件以允许该令牌访问文件。但这似乎很麻烦,因为 fread 没有太多好处。您可以考虑使用 Charles charlesproxy.com 设置负载测试。 Fiddler fiddler2.com 可能也可以通过扩展来做到这一点。
【解决方案2】:

我在这里回答了一个类似的问题limiting users to subdirectories,您应该可以根据自己的需要进行调整,我也在这里复制了它。

下载.php

<?php
/** Load your user assumed $user **/

$file = trim($_GET['file']);

/** Sanitize file name here **/

if (true === file_exists('/users/user'.$user->id.'/'.$file)) {
   //from http://php.net/manual/en/function.readfile.php
   header('Content-Description: File Transfer');
   header('Content-Type: application/octet-stream');
   header('Content-Disposition: attachment; filename="'.$file.'"');
   header('Content-Transfer-Encoding: binary');
   header('Expires: 0');
   header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
   header('Pragma: public');
   header('Content-Length: ' . filesize($file));
   ob_clean();
   flush();
   readfile($file);
   exit;
} else {
   throw new Exception('File Not Found');
}

.htaccess 拒绝所有直接文件下载

deny from all

然后您将使用 /download.php?file=filename.ext 链接到文件夹,它只会从当前用户的用户目录下载该文件。

您需要确保清理输入文件名,以免受到目录横向攻击。

【讨论】:

  • 嗨,这会给服务器带来额外的负担吗?这样 100 个用户一次下载不同的 1mb 文件(100x100mb)会导致内存或处理能力削弱??
  • 是的..我想我会使用这种方法,连同 xsendfile。干杯
猜你喜欢
  • 2012-11-21
  • 2010-11-28
  • 2020-08-07
  • 2011-06-13
  • 2011-11-14
  • 2013-12-22
  • 1970-01-01
  • 2011-08-12
相关资源
最近更新 更多