【问题标题】:Looking for a secure method to hold private files for a given user寻找一种安全的方法来保存给定用户的私人文件
【发布时间】:2019-05-07 08:32:09
【问题描述】:

我正在寻找一种安全的方式来允许用户上传文件(例如 PDF),以便将来(由该用户)访问,同时拒绝其他任何人访问

使用标准帐户创建/登录过程对用户进行身份验证,并且他们的凭据保存在会话中(使用 Linux/Apache/MySql/Php)。

问题:


文件应该存放在哪里?

1) 我可以为每个用户创建一个目录(在创建帐户时)并将目录名称设为盐渍哈希。那会是安全的方式吗?

2) 我应该将上传的文件放在 webroot 之外的服务器上的某个位置,然后将文件移动到一个临时位置以显示给用户吗? (然后在用户完成后销毁该文件和该临时位置)。

(假设上面的选择 #1)我计划为每个目录创建一个 .htaccess 文件,其中包含以下内容:

order deny,allow
deny from all

对于给定目录来说,这是否足够安全,还是更需要?

平台: * 使用 LAMP 堆栈的共享服务器 (PHP 7.0+)


更新:

我找到了关于这个问题的一个很好的讨论:

Arguments for and against putting files outside of webroot

似乎反对使用 .htaccess 保护 webroot 文件的论点是:

更新(续)

  • 到目前为止,我发现反对使用 .htaccess 的唯一理由是:

想象一下,虚拟主机的服务器默认设置是:没有 PHP,没有 .htaccess,允许所有人(在生产中几乎不常见) 环境)。如果您的配置在例行程序中以某种方式重置 操作——比如,面板更新——一切都将恢复到它的 默认状态,你就暴露了。

【问题讨论】:

  • 选项 3. 将文件放在非公共位置,当用户请求文件时运行 PHP 代码以验证用户可以访问文件并使用readfile发送文件
  • 是的,我有点喜欢 Anthony Rutledge 在 stackoverflow.com/questions/4603901 上的回答……但它只有 1 票!
  • apokryfos,您会为每个用户创建一个独特的“非公共位置”吗?如果是这样,对创建唯一目录名称的方法有什么想法吗?
  • 通常你会让用户提供一些独特的东西来识别他们,以便他们使用它来登录,比如电子邮件或昵称或电话号码。您可以使用它,因为目录不是公开的。

标签: php .htaccess security


【解决方案1】:

您没有直接说明它,但由于您提到.htaccess,我假设您要进行文件传输的协议是http,使用php 和apache?

文件应该存放在哪里?

有一个专用于用户文件夹的文件夹,确保该文件夹位于网络根目录之外,并在用户文件夹文件夹内为每个用户提供自己的专用文件夹。

1) 我可以为每个用户创建一个目录(在创建帐户时)并将目录名称设为盐渍哈希。那会是安全的方式吗?

你说The user is authenticated using a standard account-creation/login process and their credentials are held in session.,我假设每个用户都有自己的专用ID?通常是 SQL PRIMARY KEY 的唯一 ID?如果是,则该 id 已经保证是唯一的,无需将目录名称设为盐渍哈希,只需将目录名称设为用户 id,这将使一切变得更容易(实现、调试、维护、磁盘-使用物流)

并且.. 有一个执行文件索引和文件传输的 php 脚本,当人们请求下载文件时,确保有严格的文件验证,您需要验证请求的文件确实位于一个文件夹中被请求者实际上有权访问所请求的文件,否则你会得到黑客请求其他人的文件,或者黑客请求/users-folder/user_1387/../../../../etc/passwd 或类似的(你可以使用 realpath() + strpos() 进行此类验证)。

.并且因为 Apache 在文件传输方面比 php 好得多,一旦请求下载文件并经过验证,您应该使用 X-Sendfile 或类似文件来实际进行文件传输,apache 将能够传输文件的效率比 php.. (如果由于某种原因你不能使用 X-Sendfile,那么检查 php passthru() 函数,但如果你打算支持流/内容范围/类似的东西,这在 PHP 中很难且效率低下,但对 apache 来说很容易)

【讨论】:

  • 感谢您的回答。是的,我正在使用 php 通过 https 传输文件。总的来说,我一直在寻找一个充分的理由,说明 .htaccess 受保护目录的安全性低于 webroot 之外的目录。对这个问题的看法似乎差异很大(参见wordpress.stackexchange.com/questions/58391/…)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
  • 1970-01-01
  • 1970-01-01
  • 2022-08-07
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多