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()
,都会失败。