Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.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
Smarty:评估存储在PHP变量中的模板_Php_Smarty - Fatal编程技术网

Smarty:评估存储在PHP变量中的模板

Smarty:评估存储在PHP变量中的模板,php,smarty,Php,Smarty,我有一个php变量,其中包含html/smarty代码 $x='<a href="{$link}" >{$title}</a>'; $x=''; 这些数据是从数据库中获取的,我想使用smarty对其进行评估,并将输出放入一个php变量(打印出来或再次保存到数据库) 谢谢 编辑: 我希望使用smarty评估X的内容,就像X的内容存储在file.tpl中一样,然后$y=$smarty->fetch('file.tpl')。。。要在不需要将x的内容保存到文件中的情况下执行此

我有一个php变量,其中包含html/smarty代码

$x='<a href="{$link}" >{$title}</a>';
$x='';
这些数据是从数据库中获取的,我想使用smarty对其进行评估,并将输出放入一个php变量(打印出来或再次保存到数据库)

谢谢

编辑:


我希望使用smarty评估X的内容,就像X的内容存储在file.tpl中一样,然后$y=$smarty->fetch('file.tpl')。。。要在不需要将x的内容保存到文件中的情况下执行此操作,请参见此处的“示例15.9.使用自定义资源”:
如果我在跟踪您,您的意思是整个字符串都在数据库中,也就是说,{$link}是字符串的一部分。我不确定smarty到底是如何工作的,但在我看来,如果它能够做到这一点,那么该字符串必须在其上运行eval()。(除非smarty正在做一些我不知道的时髦事,否则我不会和smarty一起工作)

这意味着这里的设置非常不安全。如果您的数据库曾经遭受SQL注入,您的整个服务器可能会受到损害

通过硬编码到应用程序中的文件运行这些文件并不是一个很大的安全问题,因为您可以控制调用.tpl的代码,并且可以控制.tpl本身。这是eval的一种“安全”使用,因为您必须对服务器进行一些认真的访问才能利用它,这种访问将是利用它的原因


但是,一旦您从数据库中访问这些数据,可能是使用某种管理系统(允许您添加新的动态模板),您就在系统中创建了一个窗口,攻击者可能会潜入其中。

如果您使用Smarty 3,您可以通过

$smarty->fetch('string:'.$template_string);
“eval:”.$template\u字符串

如果您不使用Smarty 3,并且没有字符串/eval资源,则可以使用。我发现这比创建自定义资源简单得多,问题也小得多

$template = "put some {$variables} in here"
require_once( $smarty->_get_plugin_filepath( 'function', 'eval' ));
$compiled = smarty_function_eval(array('var'=>$template), $smarty);

上面的例子对我都不起作用,可能是因为我们现在使用的是smarty的旧版本。一个对我们有效的解决方案是创建一个模板,我们称之为
eval.tpl
,它只包含以下行:

{eval var=$string}
然后,当我们想要计算字符串时,我们可以简单地使用以下内容:

$smarty->assign('string', $string);
$result = $smarty->fetch('eval.tpl');

我希望使用smarty评估X的内容,就像X的内容存储在file.tpl中一样,然后$y=$smarty->fetch('file.tpl')。。。想不需要将x的内容保存到文件中就可以吗?我想知道你使用的是什么版本?@RonanDejhero我怎么知道?很久以前,另一位开发人员将smarty添加到我们的代码库中,我在smarty.class中看不到任何版本号。php@RonanDejhero等等,实际上它是作为类的属性存在的。它是版本“2.6.18”。另一方面,如果系统已经经历了SQL注入,那么在smarty中运行eval可能是您最不关心的问题。