执行带有限制的PHP代码

时间:2011-03-20 08:46:55

标签: php regex

我们有一个CMS编辑器,允许在其中使用php,但是我们需要限制访问一些命令,如file_get_contents,file()和global。

有人可以帮助我使用布尔响应正则表达式吗?模板中的文本存储在字符串中。

我知道,这可能不是一个理想的方法,但现在我可以想出来了:)

3 个答案:

答案 0 :(得分:6)

你想做的事几乎是不可能的。如果您允许人们在您的计算机上执行代码,那么保护自己免受攻击真的很难。

以下是我对它的尝试:SandboxSource code

它的作用基本上是为文件系统访问,shell访问,aso维护了一大堆列入黑名单的函数(我允许一些函数来读取像show_source这样的文件系统,如果你想用它来实现它们是不允许的真实的东西。)

它还会尝试通过将其转换为$func = 'unlink'; $func(__FILE__); a.s.o来防止更多隐藏的攻击,例如$func = 'unlink'; ${'___xyz'.!$___xyz=Sandbox::checkVarFunction($func)}(__FILE__)

PS:你可能还不想让人们在你的网站上运行PHP代码。风险太大了。相反,我会允许人们在编辑器中使用模板语言。一个好的候选者是Twig,因为它有一个内置的沙箱,允许你限制使用某些标签,函数,......

答案 1 :(得分:2)

要完全保护自己将非常困难。

在我看来,你有几个选择:

  1. 搜索内容中不允许的预定义字符串(如file_get_contents),并显示一条错误消息,指出用户无法保存此内容。然而,这将导致“黑客攻击”,您将最终搜索所有可能的字符,例如在某些情况下有效的()

  2. 使用token_get_all并尝试将内容解析为PHP。然后,您可以遍历整个源代码,逐个令牌,并查看是否找到了您不接受的令牌。

  3. 为此编写您自己的语言或DSL。这种语言应该只能做你想要的。根据您的要求,这可能是最简单,最易于维护的方式。

答案 2 :(得分:-3)

您可以使用preg_match。使用:

if(preg_match("#(file_get_contents|file)\(#i",$text))