将文本输入解释为PHP

时间:2009-07-23 12:44:40

标签: php class interpreter demo

我想让用户测试我的PHP类,其中包括裁剪和调整图像大小。

我希望他们在文本字段中编写PHP代码,发送表单,然后运行他们的代码。我怎么能这样做?

或者让用户(任何人)演示PHP类的其他安全方法是什么?

7 个答案:

答案 0 :(得分:5)

我会使用具有next-to-no权限的用户帐户生成PHP进程。将读写权限授予单个目录,但就是这样。

你仍然可以通过无限循环等方式开启自己的DoS攻击,但是如果你绝对必须这样做,那么在IE和Chrome这样非常低权限的沙箱中运行代码。

使用EVAL可能是最糟糕的想法。

答案 1 :(得分:4)

是。您可以在php中使用eval语句(之前由John http://us2.php.net/manual/en/function.eval.php链接),但要非常小心。您真的不希望用户能够自由地在您的计算机上运行代码。

我的建议会尝试采用不同的方法来进行演示 - 可能是一些灵活的例子......但不要让他们直接运行代码

答案 2 :(得分:3)

可能使用eval()函数,但不执行此操作。严重。

没有“安全”的方法让任何旧用户在您的服务器上运行自己的PHP。你正在暴露自己潜在的伤害世界。

相反,请提供优秀的文档,代码示例以及您自己演示的源代码,并鼓励潜在用户在自己的测试/开发服务器上进行试用。

答案 3 :(得分:2)

如前所述,您可以使用eval功能,但这非常危险。如果您希望用户测试代码,请准备演示页面以显示可能的用法,例如,用户可以通过HTML表单添加参数。

答案 4 :(得分:1)

答案 5 :(得分:0)

不要以PHP或其他通用语言来思考,只需要考虑足以在您的图像处理领域表达操作的最小语言。用户使用此特定于域的语言(DSL)提交表达式,这些表达式在服务器端进行解析并传递给您的代码。

最重要的是要考虑图像处理操作的范围以及它们如何组合。这将告诉你语言的表达方式。一旦你完成了这项工作,语言在语法上会有很多选择。语言的语法可能取决于易用性和易于解析之间的权衡。

如果您可以为此类表达式编写或查找解析器,则对于用户来说可能是最简单的。实际上,任何人都可以推荐现有的表达式求值程序,它可以在这种情况下工作(例如,Smarty可以安全地运行用户提交的表达式吗?),或者确实是PHP的解析器生成器?

resize(rotate("foo.png", 90), 50)

this这样的语言可能对用户来说不太容易,但可以使用相当简单的堆栈计算机进行处理:

"foo.png" 90 rotate 50 resize

更简单,像这样的基于XML的语言不需要自己的解析器:

<resize percent="50"><rotate degrees="90"><img src="foo.png"></rotate></resize>

使用DSL并不能保护您免受特定于域的攻击,例如,有人可能会使用上述语言将图像大小调整为数百万像素并耗尽所有服务器内存。因此,DSL必须有某种运行时环境,限制任何用户提交的脚本可以使用的资源量。

答案 6 :(得分:0)

您可以使用 eval ,但不能没有采取一些预防措施。

如果您的安全问题只是“谨慎”而不是“偏执”,那么您有几个选择:

  • 如果你有一个专门针对你的项目的Apache / PHP实例,请在php.ini中设置disable_functions选项并关闭所有文件和网络相关的功能。这将影响整个PHP安装,并会打破一些令人惊讶的事情,比如phpmyadmin。
  • 如果您没有专用服务器,请尝试'runkit':http://php.net/manual/en/book.runkit.php仅在已经运行的脚本中禁用功能。
  • 也许更多工作?设置一个虚拟机(VirtualBox,VMware等),该虚拟机在主机操作系统中被激活防火墙,内存和磁盘空间分配最少,并在那里运行不受信任的代码。

如果你是偏执狂...为所有上传的代码设置批准程序。