如何防止用户操作文件系统

yce*_*uto 2 php permissions sandbox heroku

信息

我在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.
Run Code Online (Sandbox Code Playgroud)

用户可以在他们的帐户中有许多phpfiddles,每个phpfiddles对应一个随机目录,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),在这种情况下是必需的.

小智 6

实际上,没有.运行诸如此类服务的安全问题会导致您执行不受信任的第三方代码,这需要大量的技术规划和基础架构.

要了解问题的严重性,有一家公司提供此类服务(ideone.com,没有从属关系).它的母公司Sphere Engine提供此服务,以便在安全的环境中运行不受信任的代码.

特别是在Heroku上运行,如果被恶意使用,你的服务可能会给你带来很多麻烦(例如使用PHP的邮件发送大量垃圾邮件(),使用PHP的CuRL通过DoS定位其他用户).这些问题只会延伸到一个用户删除另一个用户的文件,并可能会让你被Heroku禁止.恶意行为者可以并且将会找出系统的方法.

-

为了更进一步,让我们考虑一下你理论上要完成这项任务需要做些什么.

您将首先使用类似Docker的东西,这是一个基本上像操作系统一样运行的容器.您需要配置环境,以便在容器上运行的代码不能访问Internet,CPU时间有限,并且在每次执行代码后都会被销毁.

每次用户提交代码时,您基本上都会将代码复制到容器中并允许代码运行.然后,您将能够捕获容器的输出并将其返回给用户.

这是您需要完成此任务的粗略概述.