Smarty:评估存储在 PHP 变量中的模板
Posted
技术标签:
【中文标题】Smarty:评估存储在 PHP 变量中的模板【英文标题】:Smarty : evaluate a template stored in a PHP variable 【发布时间】:2011-05-17 22:25:42 【问题描述】:我有一个 php 变量,其中包含 html/smarty 代码
$x='<a href="$link" >$title</a>';
此数据是从数据库中获取的,我想使用 smarty 对其进行评估并将输出放入 php 变量中(打印出来或再次将其保存到数据库中)。
谢谢
编辑:
我希望使用 smarty 评估 X 的内容,就好像 x 的内容存储在 file.tpl 然后 $y=$smarty->fetch('file.tpl'); ...想要做到这一点而不需要将 x 的内容保存到文件中
【问题讨论】:
我希望使用 smarty 评估 X 的内容,就好像 x 的内容存储在 file.tpl 然后 $y=$smarty->fetch('file.tpl'); ...想要做到这一点而不需要将 x 的内容保存到文件中 【参考方案1】:请参阅此处的“示例 15.9。使用自定义资源”: http://www.smarty.net/docsv2/en/template.resources
【讨论】:
【参考方案2】:如果我在关注你,你的意思是整个字符串都在数据库中,也就是说,$link 作为字符串的一部分。我不确定 smarty 究竟是如何工作的,但在我看来,如果它甚至可以做到这一点,那么该字符串将必须在其上运行 eval()。 (除非 smarty 正在做一些我想念的时髦的事情,否则我不会和 smarty 一起工作)
这意味着您的设置非常不安全。如果您的数据库遭受 SQL 注入,您的整个服务器可能会受到威胁。
从硬编码到应用程序中的文件上运行这些文件并不是一个巨大的安全问题,因为您可以控制调用 .tpl 的代码,并且可以控制 .tpl 本身。这是对 eval 的“安全”使用,因为您必须对已经能够利用它的服务器进行一些严格的访问,这种访问将是利用它的原因。
但是,一旦您从数据库访问该数据,大概是使用某种可以让您添加新动态模板的管理系统,您就在系统中创建了一个窗口,攻击者可能会潜入其中。
【讨论】:
另一方面,如果系统已经遭受 SQL 注入,那么在 smarty 中运行 eval 可能是您最不关心的问题。【参考方案3】:如果您使用 Smarty 3,您可以通过以下方式轻松完成
$smarty->fetch('string:'.$template_string);
或'eval:'.$template_string
。
更多关于它在manual
【讨论】:
【参考方案4】:如果您没有使用 Smarty 3 并且没有字符串/eval 资源,您可以使用Smarty eval plugin。我发现这比创建自定义资源要简单得多,而且问题要少得多。
$template = "put some $variables in here"
require_once( $smarty->_get_plugin_filepath( 'function', 'eval' ));
$compiled = smarty_function_eval(array('var'=>$template), $smarty);
【讨论】:
【参考方案5】:以上示例均不适合我,可能是因为我们目前使用的是旧版本的 smarty。一个对我们有用的解决方案是创建一个模板,我们称之为eval.tpl
,其中仅包含以下行:
eval var=$string
然后,当我们想要评估字符串时,我们可以简单地使用以下内容:
$smarty->assign('string', $string);
$result = $smarty->fetch('eval.tpl');
【讨论】:
我想知道您使用的是什么版本? @RonanDejhero 我怎么知道?另一位开发人员很久以前将 smarty 添加到我们的代码库中,我在 Smarty.class.php 中看不到任何版本号 @RonanDejhero 等等,实际上它是作为类的属性存在的。它是“2.6.18”版本。以上是关于Smarty:评估存储在 PHP 变量中的模板的主要内容,如果未能解决你的问题,请参考以下文章
Smarty模板中使用getpostrequestcookiessession变量的方法
PHP 自定义 Smarty 模板引擎类 高洛峰 细说PHP