你应该really尽量避免使用eval
如果可能的话。它带来了巨大且几乎无法克服的安全风险。在我的职业生涯中,我从未遇到过使用此功能的充分理由。如果您发布一个示例,也许我们可以帮助您找到一种方法来实现您的目标,而无需承担巨大的风险。
除了免责声明之外,我认为问题在于您正在开始表达eval
这需要完整。
你可以试试这个:
<?php
$test = eval("return 1==1;");
if($test)
{
echo 'abc';
}
edit:
目标是做这样的事情:
[if {expression}][blog_title][endif]
这是一个想法。只需使用用户可以设置的变量,而不是允许用户输入任何表达式。例如:
[if should_show_blog_title][blog_title][endif]
然后,用户可以执行此操作(伪代码,因为我不确定您的模板 API 是什么样子):
$template = new Template();
// shows blog title
$template->set_variable('should_show_blog_title', 1 == 1); // 1 == 1 is true, so the variable is true
$template->set_variable('blog_title', 'Awesomesauce Blog!');
// doesn't show title
$template->set_variable('should_show_blog_title', 1 == 0); // 1 == 0 is false, so the variable is false
$template->set_variable('blog_title', 'Awesomesauce Blog!');
另一个想法是提供用户可以使用的有限数量的运算符或函数。代替eval
解析它,你必须解析它。例如:
[if not_empty(blog_title)][blog_title][end if]
然后,当您解析和编译模板(基本上插入数据)时,您会查找这些特殊函数并将它们翻译为 PHP。这基本上是白名单,因为您只允许用户执行非常有限的功能子集。
你应该看看Mustache http://mustache.github.com/,这遵循第一个想法。实现实际上非常简单。 Mustache 的 PHP 实现在这里:胡子.php http://github.com/bobthecow/mustache.php。您可以查看示例和一些代码,看看是否可以获得一些想法。
要记住的一件事是,如果您eval
荷兰国际集团,模板引擎不会那么用户友好,因为用户必须在他们的条件下编写有效的 PHP。 Mustache 的部分吸引力在于它非常简单且非常易于使用。我是一名经验丰富的 PHP 开发人员,虽然我可以整天使用 PHP,但我仍然更喜欢使用 Mustache 进行模板,因为它可以让我切入主题。