php - 如何防止用户操纵文件系统

标签 php heroku permissions sandbox

信息

我在 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/

相关文章:

MongoDB 权限 : restrict access to two databases

php - 无法在 codeigniter 中加载 Css

php - 从页面后面获取代码

git - 无法将我的代码推送到 Heroku : Permission denied <public key> fatal: Could not read from remote repository

javascript - 可以使用 console.logs 绕过 Heroku 的免费计划的 "Sleeps after 30 mins of inactivity"吗?

java - Win7 64 位 jre7 & jdk1.7.0_25 中的导入按钮错误 java.security.accesscontroleexception 访问被拒绝(java.util.propertypermission user.dir 读取)

php - 无法连接服务器以从本地系统访问数据库

javascript - 如何在js XMLHttpRequest中捕获php重定向?

heroku - 在ram中保存一个大文件好一会儿吗?

nginx突然开始向/var/lib/nginx抛出权限被拒绝