【发布时间】:2011-08-07 18:34:59
【问题描述】:
原问题
所以我正在从事的项目对文件上传非常偏执。
在这个问题的范围内,关于有效载荷,我没有使用该术语。我说的是机密性。
程序总是会崩溃并在文件系统中留下临时文件。这很正常。 稍微保密性偏执狂可以编写一个 cronjob,每隔几分钟就会访问临时文件夹,并在 cronjob 调用之前删除任何早于几秒钟的内容(不是所有内容,只是因为否则它可能会捕获正在上传的文件)。
...不幸的是,我们更进一步:
理想情况下,我们希望永远不会在与进程相关的 RAM 中的任何地方看到来自文件上传的临时文件。
有没有办法教 PHP 在内存中而不是在文件系统中寻找临时文件? 我们使用 PHP-FPM 作为 CGI 处理程序,使用 Apache 作为我们的网络服务器,以防万一让它变得更容易。 (另请注意:'Filesystem' 是这里的关键字,而不是 'disc',因为当然有将文件系统映射到 RAM 的方法,但这并不能解决可访问性和自动崩溃后清理问题。 )
或者,有没有一种方法可以在将这些临时文件写入光盘时立即加密,这样它们就不会被保存在文件系统中没有加密?
线程概览
很遗憾,我只能接受 一个 的答案 - 但对于阅读本文的任何人来说,整个帖子非常 很有价值,并且包含许多人的集体见解。根据您希望达到的目标,接受的答案您可能不感兴趣。如果您是通过搜索引擎来到这里的,请花点时间阅读整个帖子。
以下是我看到的用例汇编,以供快速参考:
Re: PHP 的临时文件
-
RAM 而不是磁盘(例如,由于 I/O 问题)→RAMdisk/comparable(plasmid87,Joe Hopfgartner)
-
立即(每个文件系统用户)加密 → encFS (ADW) (+ a gotcha 根据 Sander Marechal)
-
安全文件权限 → restrictive native Linux permissions (optionally per vhost) (Gilles) 或 SELinux(参见各种 cmets)
-
进程附加的内存而不是文件系统(因此进程崩溃会删除文件)(最初是由问题提出的)
-
不要让文件数据直接到达PHP→reverse-proxy(Cal)
-
禁用 PHP 写入文件系统 → see PHP bug link in this answer (Stephan B) 或 run PHP in CGI mode (Phil Lello)
-
只写文件 →
/dev/nullfilesystem (Phil Lello)(如果您可以以流的形式访问数据另外但无法关闭文件,这很有用- 编写并行运行的功能;PHP 是否允许这样做还不清楚)
-
回复:您的文件,上传后
- 存储在数据库而不是磁盘中 → file encryption in a database HowTo (Rook)
【问题讨论】:
-
有没有办法教 PHP 在内存而不是文件系统中寻找临时文件作为 blob? --> 使用 tmpfs 作为临时上传目录。
-
@Artefact2:关键字非常filesystem(请参阅您引用的段落的其余部分)。恐怕这对我一点帮助都没有。
-
为什么不保护文件系统?在功能性用户 ID 下运行您的 php/apache 或其他任何内容,并允许该用户 ID 并且只有该用户 ID 访问临时目录。
-
@James Anderson:我想要每个进程甚至每个请求的东西,而不是每个程序。有强大的按程序解决方案(SELinux/EncFS/comparable),虽然不完美,但肯定会缓解问题,因此这绝对是一个将要追求的步骤,但仍然不是最佳的。
-
无论是谁经历了所有的答案并否决了它们(这就是现在的样子,如果我判断错误,我深表歉意),我对你否决的一些答案投了赞成票,如果你说你为什么不给他们投票,所以我知道为什么不去追求那条路。
标签: php security apache file-upload temporary-files