寻找一种安全的方法来保存给定用户的私人文件

时间:2019-05-07 08:32:10

标签: php .htaccess security

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

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

问题:


文件应保存在哪里?

1)我可以为每个用户创建一个目录(在创建帐户时),并使该目录名称成为一个盐腌哈希。这样做安全吗?

OR

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,允许所有人使用(在生产环境中很少出现这种情况)   环境)。如果您的配置在例行程序期间被重置   操作-例如面板更新-一切都会恢复到   默认状态,那么您就暴露了。

1 个答案:

答案 0 :(得分:0)

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

  

文件应存放在哪里?

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

  

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来说很容易