Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.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
Php 评估代码赢得';行不通_Php - Fatal编程技术网

Php 评估代码赢得';行不通

Php 评估代码赢得';行不通,php,Php,我正在尝试制作自己的模板引擎,(不要问为什么!) 并将尝试制作: {{@Form::input("name")}} 在我的渲染系统中,我将生成以下评估代码: preg_match_all('/\{\{\@(.*?)\}\}/is',$data,$output); $out=""; foreach ( $output[1] as $variables): $find = '{{@' . $variables . '}}'; $data

我正在尝试制作自己的模板引擎,(不要问为什么!)

并将尝试制作:

{{@Form::input("name")}}
在我的渲染系统中,我将生成以下评估代码:

    preg_match_all('/\{\{\@(.*?)\}\}/is',$data,$output);

    $out="";

    foreach ( $output[1] as $variables):
        $find = '{{@' . $variables . '}}';

        $data = str_replace($find, eval($variables), $data);
    endforeach;
但我得到了这个错误

 Parse error: syntax error, unexpected $end in /home/psafari/public_html/slt/classes/template.class.php(43) : eval()'d code on line 1
它应该运行模板引擎中指定的“Form::input('something')。我做错了什么?

尽管优步已经发表了反对构建新模板引擎的相关评论,但我还是建议打破发现的字符串。以
{{@Form::input(“name”)}
为例,您将拥有{{@类名::函数名(params)}。因此,使用regex可以中断找到的字符串(正如您已经做的那样),创建检测到的类的实例或引用该类,然后使用动态调用调用解析的方法(如果未找到任何一个,则显然是失败/错误)

至于参数,您可以避免使用限定符(本例中为引号)并在每个逗号上断开,或者使用限定符并再次通过正则表达式对其进行不同的解析。你的电话。对于解析并找到的每个参数,都会将它们添加到函数调用中。为了避免
eval
,并且考虑到PHP不支持随机数目的参数(例如Python使用
args
kwargs
),将数组作为模板文件上使用的函数的单个参数


您还可以有一种“接口”函数,它接受一定数量的参数,然后接收函数(或类+函数名),计算它找到的参数数量,最后根据找到的正确参数数量将调用转发到实际的基础函数。虽然您添加的越多,处理就变得越模糊-假设您的模板引擎的用户能够定义新的模板方法,使用第二种方法是一个非常糟糕的主意(因为您必须在这些接口函数上支持多达N个参数)。

$variables
中有什么?你能发布一些示例输入吗?这段代码有很多错误。请重新考虑你的方法。99/100当您使用eval时,这是个坏主意。
eval
ed代码需要包含语句,而不是未关闭的表达式。例如
returncall()+1我强烈建议不要为此使用eval。制作模板引擎没有什么错,但绝对不要使用
eval()
。这是最大的安全风险。使用
eval()。包含要运行的代码的标记的模板没有问题,但是应该限制它能做什么
eval()
是错误的解决方案。@RandomSeed:是,它仍然适用。即使它在您的主要安全性后面,它仍然会让您面临二次攻击。通过网站基本安全保护的黑客可以窥探整个系统,如果他愿意,还可以破坏页面。这已经够糟糕的了。但是如果他发现自己可以运行
eval()
,他可以造成更大的伤害。让你的主要安全性尽可能好,但要假设它可能会被破坏;你需要尽可能的安全,即使有人通过。在系统中的任何位置使用
eval()
,都会失败。