<?php
eval("if (1==1){");
echo ('abc');
eval("}");
?>
Run Code Online (Sandbox Code Playgroud)
然后我得到一个错误:解析错误:解析错误在C:\ wamp\www\test\index.php(2):eval()'代码在第1行abc解析错误:解析错误在C:\ wamp\www\test\index.php(4):第1行的eval()'代码
如何修复?
dav*_*nal 10
你应该真的尽量避免使用eval,如果在所有可能的.它带来了巨大且几乎无法克服的安全风险.我从未在我的职业生涯中遇到过使用此功能的充分理由.如果你发布一个例子,也许我们可以帮助你找到一种方法来实现你的目标,而没有这种巨大的风险.
除了免责声明,我认为问题在于你eval需要完成一个表达式.
你可以试试这个:
<?php
$test = eval("return 1==1;");
if($test)
{
echo 'abc';
}
Run Code Online (Sandbox Code Playgroud)
编辑:
目标是做这样的事情:
[if {expression}][blog_title][endif]
Run Code Online (Sandbox Code Playgroud)
这是一个想法.不要让用户输入任何表达式,只需使用用户可以设置的变量.例如:
[if should_show_blog_title][blog_title][endif]
Run Code Online (Sandbox Code Playgroud)
然后,用户可以这样做(伪代码,因为我不确定你的模板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!');
Run Code Online (Sandbox Code Playgroud)
另一个想法是提供用户可以使用的有限数量的操作员或功能.而不是eval它,你必须解析它.例如:
[if not_empty(blog_title)][blog_title][end if]
Run Code Online (Sandbox Code Playgroud)
然后,当您解析并编译模板(基本上插入数据)时,您将查找这些特殊函数并将它们转换为PHP.这基本上是白名单,因为您只是让用户执行非常有限的功能子集.
你应该看看Mustache,这是第一个想法.实现实际上非常简单.胡子的PHP实现在这里:mustache.php.您可以查看示例和一些代码,看看是否可以获得一些想法.
要记住的一件事是,如果你正在使用eval,模板引擎将不会像用户友好,因为那时用户必须在他们的条件下编写有效的PHP.小胡子的部分吸引力在于它非常简单且易于使用.我是一个有经验的PHP开发人员,而我可以在PHP终日劈死,我还是喜欢胡子的模板,因为它只是让我切入正题.