<?php
eval("if (1==1){");
echo ('abc');
eval("}");
?>
然后我收到一个错误: 解析错误:解析错误在C:\ wamp \ www \ test \ index.php(2):eval()'代码在第1行 ABC 解析错误:解析错误在C:\ wamp \ www \ test \ index.php(4):eval()'代码在第1行上 怎么解决?
答案 0 :(得分:9)
如果可能的话,你应该真的尽量避免使用eval
。它带来了巨大且几乎无法克服的安全风险。我从未在我的职业生涯中遇到过使用此功能的充分理由。如果您发布示例,也许我们可以帮助您找到实现目标的方法,而不会产生巨大的风险。
除了免责声明之外,我认为问题在于您在eval
中开始表达需要完成的内容。
您可以尝试这样做:
<?php
$test = eval("return 1==1;");
if($test)
{
echo 'abc';
}
修改强>
目标是做这样的事情:
[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,这是第一个想法。实现实际上非常简单。胡子的PHP实现在这里:mustache.php。您可以查看示例和一些代码,看看是否可以获得一些想法。
要记住的一件事是,如果你是eval
,模板引擎就不会像用户友好一样,因为那时用户必须在他们的条件下编写有效的PHP。小胡子的部分吸引力在于它非常简单且易于使用。我是一名经验丰富的PHP开发人员,虽然我可以整天破解PHP,但我仍然喜欢使用小胡子进行模板操作,因为它只是让我能够达到目的。
答案 1 :(得分:3)
简单......
<?php
eval(
"if (1==1){".
"echo ('abc');".
"}");
?>
eval('
... ')
中的内容必须是自我完成的表达或陈述,而“}
”不是。