信息
我在 Heroku 中有一个 phpfiddle 应用程序,用户可以在其中使用任何 php 代码。
基本上这是应用程序结构(样本):
/app/
|
|--fiddle/ <-- contains all php fiddles generated by the user.
| |
| |-- abcde/ <-- random directory.
| |
| |--index.php <--- custom user code.
|
|--app.php <--- entry point and main app file.
用户可以在他们的帐户中有多个 phpfiddle,每个都对应于一个随机目录和index.php
文件通过 <iframe>
执行稍后。
问题
如何避免任何应用程序用户可以通过 index.php
创建/列出/删除其随机目录之外的任何文件/目录文件?
研究
我目前的解决方案是解析 PHP 用户代码(在执行之前)并检测所有可能的函数,例如 file_put_contents()
, unlink()
, mkdir()
, dir()
, rmdir()
和其他人,但这限制了测试范围,我需要用户可以在他们的上下文中使用这些函数。
恐怕我需要根据资源执行(我猜)“动态地”为文件系统设置特殊权限。怎么做?有可能实现吗?
编辑:目前php.net/runkit尚不支持 PHP 7 ( https://github.com/zenovich/runkit/issues/87 ),但在这种情况下这是必需的。
最佳答案
实际上,不。运行这样的服务的安全隐患需要大量的技术规划和基础设施。
要了解问题的严重性,有一家公司提供此类服务(ideone.com,无隶属关系)。它的母公司 Sphere Engine 将此作为一项服务提供,以在安全环境中运行不受信任的代码。
特别是在 Heroku 上运行,如果您的服务被恶意使用(例如,使用 PHP 的 mail() 发送大量垃圾邮件,使用 PHP 的 CuRL 通过 DoS 攻击其他用户),您的服务可能会让您很头疼。这些问题会扩展到一个用户删除另一个用户的文件,并且可能会让你被 Heroku 禁止。恶意行为者可以并将找出绕过您系统的方法。
--
为了更进一步,让我们考虑一下理论上您需要做什么才能完成这样的任务。
您将从使用 Docker 之类的东西开始,这是一种本质上像操作系统一样运行的容器。您需要配置环境,以便在容器上运行的代码无法访问互联网,受 CPU 时间限制,并在每次代码执行后被销毁。
每次用户提交代码时,您基本上都会将代码复制到容器中并允许代码运行。然后,您将能够捕获容器的输出并将其返回给用户。
这是您完成此任务所需的非常粗略的概述。
关于php - 如何防止用户操纵文件系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40939717/