我们有一个CMS编辑器,允许在其中使用php,但是我们需要限制访问一些命令,如file_get_contents,file()和global。
有人可以帮助我使用布尔响应正则表达式吗?模板中的文本存储在字符串中。
我知道,这可能不是一个理想的方法,但现在我可以想出来了:)
答案 0 :(得分:6)
你想做的事几乎是不可能的。如果您允许人们在您的计算机上执行代码,那么保护自己免受攻击真的很难。
以下是我对它的尝试:Sandbox。 Source 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)
要完全保护自己将非常困难。
在我看来,你有几个选择:
搜索内容中不允许的预定义字符串(如file_get_contents),并显示一条错误消息,指出用户无法保存此内容。然而,这将导致“黑客攻击”,您将最终搜索所有可能的字符,例如在某些情况下有效的()
。
使用token_get_all并尝试将内容解析为PHP。然后,您可以遍历整个源代码,逐个令牌,并查看是否找到了您不接受的令牌。
为此编写您自己的语言或DSL。这种语言应该只能做你想要的。根据您的要求,这可能是最简单,最易于维护的方式。
答案 2 :(得分:-3)
您可以使用preg_match。使用:
if(preg_match("#(file_get_contents|file)\(#i",$text))