我们有一个CMS编辑器,允许在其中使用php,但是我们需要限制访问某些命令,如file_get_contents,file()和global。执行有限制的PHP代码
有人可以帮我一个布尔响应正则表达式吗?模板中的文本存储在一个字符串中。
我知道,可能不适合这种理想的方法,但它是所有我能想出现在:)
我们有一个CMS编辑器,允许在其中使用php,但是我们需要限制访问某些命令,如file_get_contents,file()和global。执行有限制的PHP代码
有人可以帮我一个布尔响应正则表达式吗?模板中的文本存储在一个字符串中。
我知道,可能不适合这种理想的方法,但它是所有我能想出现在:)
你想要做什么几乎是不可能的。如果你允许人们在你的机器上执行代码,那么保护自己免受攻击是非常困难的。
这里是我对它的尝试:Sandbox。 Source code。
它的功能基本上是维护一个列表,用于文件系统访问,shell访问,aso(我允许一些函数用于读取像show_source
这样的文件系统,如果你想用它来实现某些功能,就不应该允许它。 )
它也试图通过将其更改为$func = 'unlink'; ${'___xyz'.!$___xyz=Sandbox::checkVarFunction($func)}(__FILE__)
aso来防止更多隐藏的攻击,如$func = 'unlink'; $func(__FILE__);
aso
PS:你可能不想让人们在你的网站上运行PHP代码。风险太大了。相反,我会让人们在编辑器中使用模板语言。一个好的候选人将是Twig,因为它有一个内置的沙箱,它允许您限制使用某些标签,功能,...
您可以使用preg_match这一点。使用方法:
if(preg_match("#(file_get_contents|file)\(#i",$text))
这将是非常困难的,以保护自己完美。
在我看来,你有几种选择:
搜索预定义的字符串这是不是在你的内容(如的file_get_contents)允许并显示一条错误消息说,用户不能保存,因为这个。然而,这会导致“黑客”,你最终会搜索所有可能的字符,如()
,在某些情况下可能有效。使用token_get_all并尝试将内容解析为PHP。然后,您可以遍历整个源代码,通过令牌循环查看,并查看是否找到您不接受的令牌。
写下你自己的语言或DSL。这种语言应该只能做到你想要的。根据您的要求,这可能是最简单和最可维护的方法。
你肯定会遇到问题。那么'$ a ='文件'; $ A();'? – knittl 2011-03-20 08:50:46
相关:http://stackoverflow.com/questions/3115559/exploitable-php-functions/ – Unicron 2011-03-20 09:00:53