2011-03-20 79 views
1

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

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

我知道,可能不适合这种理想的方法,但它是所有我能想出现在:)

+4

你肯定会遇到问题。那么'$ a ='文件'; $ A();'? – knittl 2011-03-20 08:50:46

+0

相关:http://stackoverflow.com/questions/3115559/exploitable-php-functions/ – Unicron 2011-03-20 09:00:53

回答

5

你想要做什么几乎是不可能的。如果你允许人们在你的机器上执行代码,那么保护自己免受攻击是非常困难的。

这里是我对它的尝试:SandboxSource code

它的功能基本上是维护一个列表,用于文件系统访问,shell访问,aso(我允许一些函数用于读取像show_source这样的文件系统,如果你想用它来实现某些功能,就不应该允许它。 )

它也试图通过将其更改为$func = 'unlink'; ${'___xyz'.!$___xyz=Sandbox::checkVarFunction($func)}(__FILE__) aso来防止更多隐藏的攻击,如$func = 'unlink'; $func(__FILE__); aso

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

+0

我实际上只是要求提供源代码:)谢谢! – Joe 2011-03-20 09:12:57

+0

@Joe你可以通过执行'hightlight_file('./ src/Sandbox.php');'; – alexn 2011-03-20 10:49:08

-2

您可以使用preg_match这一点。使用方法:

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

怎么样'$ evil =“fi”。“le”。“_ get_contents”; $邪恶($网址);'? – Unicron 2011-03-20 08:58:50

+0

没错,甚至没有想到那么远。有点奇怪,公开允许php代码。 – Jens 2011-03-20 09:09:21

2

这将是非常困难的,以保护自己完美。

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

  1. 搜索预定义的字符串这是不是在你的内容(如的file_get_contents)允许并显示一条错误消息说,用户不能保存,因为这个。然而,这会导致“黑客”,你最终会搜索所有可能的字符,如(),在某些情况下可能有效。使用token_get_all并尝试将内容解析为PHP。然后,您可以遍历整个源代码,通过令牌循环查看,并查看是否找到您不接受的令牌。

  2. 写下你自己的语言或DSL。这种语言应该只能做到你想要的。根据您的要求,这可能是最简单和最可维护的方法。