Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带eval{php}的条件_Php - Fatal编程技术网

带eval{php}的条件

带eval{php}的条件,php,Php,然后我得到一个错误: 解析错误:在C:\wamp\www\test\index.php(2):eval()代码的第1行中解析错误 abc 解析错误:在C:\wamp\www\test\index.php(4):eval()中解析错误,代码在第1行 如何修复?简单 <?php eval("if (1==1){"); echo ('abc'); eval("}"); ?> 如果可能的话,你应该真的尽量避免使用eval。它带来了巨大且几乎无法抵御的安全风险。在我的职业生涯中,我从未遇到过

然后我得到一个错误: 解析错误:在C:\wamp\www\test\index.php(2):eval()代码的第1行中解析错误 abc 解析错误:在C:\wamp\www\test\index.php(4):eval()中解析错误,代码在第1行
如何修复?

简单

<?php
eval("if (1==1){");
echo ('abc');
eval("}");
?>

如果可能的话,你应该真的尽量避免使用
eval
。它带来了巨大且几乎无法抵御的安全风险。在我的职业生涯中,我从未遇到过使用此功能的好理由。如果你举一个例子,也许我们可以帮助你找到一种不冒巨大风险实现目标的方法

撇开免责声明不谈,我认为问题在于您正在
eval
中启动一个需要完成的表达式

您可以尝试以下方法:

<?php
eval(
  "if (1==1){".
  "echo ('abc');".
  "}");
?>
这里有一个想法。不允许用户输入任何表达式,只需使用用户可以设置的变量即可。例如:

[if {expression}][blog_title][endif]
$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!');
然后,用户可以这样做(伪ish代码,因为我不确定模板API是什么样子):

另一个想法是提供用户可以使用的有限数量的操作符或函数。您必须解析它,而不是
eval
ing它。例如:

[if {expression}][blog_title][endif]
$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!');
然后,在解析和编译模板(基本上是在中插入数据)时,查找这些特殊函数并将其转换为PHP。这基本上是白名单,因为您只允许用户执行非常有限的功能子集

你应该看看,哪一种遵循第一个想法。实现实际上相当简单。mustache的PHP实现如下:。您可以查看示例和一些代码,看看是否有一些想法


需要记住的一件事是,如果您要
eval
ing,模板引擎将不会像用户友好一样,因为用户必须在其条件下编写有效的PHP。小胡子的部分吸引力在于它非常简单,而且使用起来非常容易。我是一名经验丰富的PHP开发人员,虽然我可以整天使用PHP,但我还是更喜欢用胡子做模板,因为它让我直截了当。

我想做一个模板引擎你想用模板引擎做模板引擎吗?不,做一个模板引擎。请回答我的问题Noob,您最好看看其他模板引擎的代码。他们可能不需要这样的代码就可以完成您的目标。使用eval的模板引擎是开发人员可以想象的最可怕的事情。我很可怜你。不知道为什么我被否决了。希望我能给你更多的支持,而不是吉姆。如果字符串来自用户或其他第三方,你是对的。但是,如果您同时控制包含
eval()
的代码和它正在执行的字符串,则不会比常规代码带来更大的风险。另外,如果您经常处理JSON,您可能已经使用过它。在本机浏览器支持之前,
eval()。别傻了,没人在乎免责声明。有时候我想,为了几个名誉点你们都准备好帮助一个杀人犯了。到此为止,我不会用eval。。。。。。。。。。。。。。。。。。我认为这是一个更好的答案。解释他为什么会出错。我有一个类似的问题:
[if not_empty(blog_title)][blog_title][end if]