【问题标题】:limiting users to subdirectories将用户限制在子目录中
【发布时间】:2011-11-23 17:28:49
【问题描述】:

我有一个用户子目录,我想将每个子文件夹仅限于该用户。

例如,我有/users/user1,我想在其中保护user1 文件夹,以便只有user1 可以访问其中的文件。

我尝试使用 .htaccess 和 .htpasswd 文件,但即使我已经针对 MySQL 数据库进行了身份验证,也会提示我第二次登录。

我不知道该怎么做才能自动处理第二次登录请求,因为用户之前会通过身份验证。

我可以发布一些我的 .ht 文件的代码,但我认为这些信息可以让事情顺利进行。

【问题讨论】:

  • 如何认证?通过 HTTP 基本身份验证?基于表单的 cookie 使用登录?这是两个几乎(通常)相互独立的不同登录系统。
  • 我知之甚少,但我觉得(apache)htpasswd和mysql认证不一样,你用的是mod_auth_mysql吗?
  • 我正在使用表单来验证数据库。我没有使用 mod_auth_mysql 至少我不认为我是。我正在获取用户名和密码,然后连接到 mysql 数据库并查看用户是否在那里并且有正确的密码,如果是这样,我会将他们引导到他们的帐户主页。我读过那篇文章,但我想如果文件是 .mp3 文件,我对如何打开文件并通过 php 将其提供给用户感到困惑......

标签: php .htaccess


【解决方案1】:

我认为在这种情况下使用 php 代理访问文件就足够了,类似于:

下载.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 链接到文件夹,它只会从当前用户的用户目录下载该文件。

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

【讨论】:

  • 谢谢,我试试看!如果我只想将文件加载到 html5 音频标签以便我可以播放它,这会起作用吗?
  • 是的,如果您将它用于音频标签,您只需执行以下操作: 我从来不需要通过音频标签来处理 mp3 文件,所以如果它不起作用,我会删除应该允许它工作的附件配置,但我没有测试它让我知道如何它去
  • 嘿,Jason,它似乎对我不起作用...仍在尝试让它工作...
  • 如果你能提供一些关于什么不起作用的细节我可以尝试帮助
  • 我会在接下来的几天里发布一些细节...有点忙于其他事情。感谢您的帮助
猜你喜欢
  • 2013-07-30
  • 1970-01-01
  • 1970-01-01
  • 2020-05-11
  • 1970-01-01
  • 2021-11-04
  • 2011-09-01
  • 2011-11-03
  • 2010-12-04
相关资源
最近更新 更多