条件与eval {php}

时间:2010-09-01 06:19:40

标签: php

<?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行上 怎么解决?

2 个答案:

答案 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(' ... ')中的内容必须是自我完成的表达或陈述,而“}”不是。