最佳实践:Zend View:从数据库加载内容并呈现内容中包含的PHP代码

时间:2011-11-05 10:29:35

标签: zend-framework parsing templates view

假设我从数据库加载一个返回类似值的值:

<?php
//Zend_Controller_Action
public function indexAction()
{
  $dbContent = "<p>Hello <?php echo $user?>!</p>";
  $this->view->paragraph = $dbContent;
}
?>

怎么可能,

<?php echo $user?>

会被渲染吗?

需要采取哪些预防措施(安全问题,XXS)?

非常感谢!

==编辑:== 对不起,我显然误解了我的问题。我实际上是在做什么:

我希望避免实施像smarty这样的模板引擎。

在我的项目中,会有一些内容在字符串中包含PHP-Code并且需要进行解析。

示例:

<?php
//Zend_Controller_Action
public function indexAction()
{
  $dbContent = "<p>Hello <?php echo $user?>!</p>";
  $this->view->paragraph = $dbContent;
}

<?php
//viewscript.phtml
$user = 'John Doe';
echo $this->paragraph;
?>

应该输出:

  

你好John Doe!

在没有外部模板引擎的情况下,是否有安全解决方案?

再次感谢...: - )

3 个答案:

答案 0 :(得分:2)

如果找到了解决方案here,这似乎完全满足了我的需求。

感谢所有在此回答的人,

<强> == UPDATE ==

不幸的是发布的链接已经死了。但是,解决方案非常简单。据我所知,它经历了以下步骤:

  1. 从数据库中提取内容并将其保存在文件中
  2. 使用Zend_Cache检查此文件是否存在
  3. 如果文件存在,只需渲染它。如果没有,请转到步骤1.
  4. ==更新II == 找到该页面的副本: archive.org

答案 1 :(得分:1)

在zend框架中,您将始终能够从控制器打印字符串(或任何您想要的内容),但它是非常糟糕的做法

您应该以这种方式将控制器中的$ user值提供给视图:

$this->view->paragraph = $user;

然后,在视图中,有:

<p>Hello <?php echo $this->paragraph; ?>!</p>

要确保来自XSS的此代码,您应该在(在打印值之前)进行一些检查,如下所示:

$user = strip_tags($user);

答案 2 :(得分:0)

Zend Framework不支持自动输出转义,但您可以通过多种方式阻止XSS。

首先将所有值推送到视图层,然后默认使用 View Helper 打印它们,例如 Zend \ View \ Escape 它返回 htmlspecialchars()下的字符串,但您可以使用以下方法设置回调函数:

//view.phtml
$this->setEscape('yourClass','methodName');
$this->setEscape('functionName');
echo $this->escape($this->myGreatDbValue);

当然,您可以根据需要创建自定义View Helper。

另一种方法是创建一个自定义View类,扩展 Zend \ View \ Abstract ,覆盖__get()魔术方法和过滤输出。

阅读Zend View Helper和Zend Filter的文档:http://framework.zend.com/manual/en/zend.filter.html http://framework.zend.com/manual/en/zend.view.helpers.html