【发布时间】: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,您会为每个用户创建一个独特的“非公共位置”吗?如果是这样,对创建唯一目录名称的方法有什么想法吗?
-
通常你会让用户提供一些独特的东西来识别他们,以便他们使用它来登录,比如电子邮件或昵称或电话号码。您可以使用它,因为目录不是公开的。