【问题标题】:Best way to allow user to inject and run php code允许用户注入和运行 php 代码的最佳方法
【发布时间】:2011-08-25 18:23:29
【问题描述】:

我一直在思考允许用户在网站上注入代码并在网络服务器上运行它的想法。这不是一个新想法——许多网站允许用户在线“测试”他们的代码——例如http://ideone.com/

例如: 假设我们有一个包含

我的问题是:如何正确地做到这一点?我们应该考虑的事情[和可能的解决方案]:

  • 安全,不允许用户做任何坏事,
  • 稳定性,不允许用户杀死 webserver 提交 while(true){},
  • 性能,服务器在可接受的时间内返回答案,
  • 控制,用户可以做任何与之前的点相匹配的事情。

我更喜欢面向 PHP 的答案,但也欢迎使用通用方法。提前谢谢你。

【问题讨论】:

标签: php web-services code-injection


【解决方案1】:

我会在网络服务器之上和外部将这个问题考虑得更高一级。有一个非常无特权的、被监禁的、经过 chroot 的独立进程来运行这些上传的 PHP 脚本,那么无论 PHP 功能是否启用,它们都会根据权限和缺乏访问权限而失败。

有一个父进程来监控上面提到的“worker”进程已经运行了多长时间,如果它太长,将其杀死,并向最终用户报告超时错误。

显然,关于如何在浏览器请求之外异步运行这个系统,有许多实现细节需要解决,但我认为它会提供一种非常安全的方式来运行不受信任的 PHP 脚本。

【讨论】:

  • 我的想法是一样的,除了虚拟化而不是 chroot-jails。
  • 这很有趣,但我认为该解决方案的“异步性”很难实现。我们仍然可以通过 AJAX 调用来做到这一点,这将是一项简单的任务,但是会出现保护它免受 DDoS 攻击的问题。
  • 好的,我看不到更多答案,所以你的答案是最好的。如果有人能回答这个问题,我将非常感激:stackoverflow.com/questions/6010401/… 但现在,我接受了。
【解决方案2】:

禁用服务器的 ini 文件中的功能不会限制应用程序本身的某些功能吗?

我认为您必须对 POST 数据进行一些核心清理,并在那里去除“非法”代码。我认为通过添加您描述的其他方法可能会使其工作。

只要记住。从 POST 数据中清除永恒的日光。

【讨论】:

  • 在我看来禁用功能不是解决方案。我宁愿将其中一些“列入白名单”,而 php.ini 没有 allowed_functions 指令。即使我能做到这一点,“稳定性”要求仍然是一个问题。
  • 禁用功能将无法正常工作。我见过他们将您的代码沙箱化的服务器,并在 15 秒后销毁沙箱。
猜你喜欢
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
  • 2020-06-01
  • 1970-01-01
  • 2010-10-04
  • 1970-01-01
  • 1970-01-01
  • 2013-09-14
相关资源
最近更新 更多