通过 tmpfile() 在 PHP 的临时目录中存储敏感数据时,主要关注什么?例如:
- 恶意管理员可以从硬盘恢复这些数据吗?
- 管理员可以轻松地将 tmp 目录更改为永久存储位置吗?
- 在初始写入过程中,数据是否可以轻松复制到另一个位置?
我的 Web 应用程序存储加密的用户数据,但我必须对其进行加密,以便它可以通过 webdav 流式传输。暂时存储解密的副本似乎是最简单的方法。否则我可能不得不发明一些基于块的加密和即时解密数据。
通过 tmpfile() 在 PHP 的临时目录中存储敏感数据时,主要关注什么?例如:
我的 Web 应用程序存储加密的用户数据,但我必须对其进行加密,以便它可以通过 webdav 流式传输。暂时存储解密的副本似乎是最简单的方法。否则我可能不得不发明一些基于块的加密和即时解密数据。
必须假定数据在写入文件时被刷新。从理论上讲,它可能会留在缓冲区中并且永远不会被刷新,但是您不能依赖它,并且您无法判断它是否确实如此。临时文件位置可能是安装在RAM 上的磁盘(如 Linux 中的 tmpfs),但您可能无权访问该信息,同样,您不能依赖这种情况。最坏的(也是最有可能的)情况是它被写入硬盘,在这种情况下,任何拥有原始磁盘读取权限的人,比如管理员,都可以搜索硬盘的原始扇区并检查数据。这并不像听起来那么难,在使用简单的 NIX 工具链接dd
和grep
.
我不认为这是一个问题。创建的文件tmpfile()
应该在您关闭文件时自动删除,无论它是在哪里创建的。(至少,手册和经验是这样说的。)
当然。管理员可以监视临时目录并复制他看到的任何文件。这在用户模式级别应该是可行的,并且如果他们非常致力于刷每个临时文件,那么在驱动程序级别肯定是可行的(如果他们编写了文件窃取驱动程序并将其放入文件系统堆栈中)。
根据经验,任何需要加密的数据都不应写入未加密的文件。文件内容不受您的直接控制,未加密的数据必须如此。
应该可以使用标准加密方案即时进行加密。它可能比进行一次大型加密调用要复杂一些,但绝对可以使用任何称职的加密库。
管理员可以做任何事情。如果管理员是你的敌人,那么你就输了。无论你把它们放在哪里,他都可以复制你的珍贵文件;他甚至可以直接读取您的 PHP 进程的 RAM 内容。
如果管理员是您的朋友,那么您的下一个敌人就是对同一台机器具有某种访问权限的其他人,例如该机器的普通(非管理员)用户,和/或在同一台服务器上运行的其他 PHP 脚本。PHPtmpfile
依赖于(至少在类 Unix 系统上)tmpfile()
操作系统提供的函数(实际上是一个 libc 函数)。如果您使用 Linux,那么您很幸运:该特定实现会在其中创建具有随机名称的文件/tmp
并立即将其删除。根据 Unix 语义,该文件仍然存在(它在文件系统中占用了一些空间)但名称被破坏,禁止其他用户进行任何访问。
您可能仍然需要担心其他 PHP 脚本,如果它们是敌对的并且 PHP 引擎没有受到适当的约束,因为这些脚本在与您的帐户相同的帐户下运行(操作系统级别的帐户,即运行 Web 服务器的 Unix 用户),因此可以从/proc
. 但这相当极端。如果不同的人,可能彼此敌对,可以将他们自己的 PHP 脚本添加到同一台服务器,而他们之间没有隔离,那么服务器结构中有一些非常错误的地方,并且管理员没有做他的工作。
为了解决第 1 点,您可以在文件上调用srm并自己显式删除它,这应该可以防止它被恢复。至于第 2 点和第 3 点,除非您自己能够保护服务器,否则它不在您的掌控之中。
希望这可以帮助