假设我从数据库加载一个返回类似值的值:
<?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!
在没有外部模板引擎的情况下,是否有安全解决方案?
再次感谢...: - )
答案 0 :(得分:2)
如果找到了解决方案here,这似乎完全满足了我的需求。
感谢所有在此回答的人,
<强> == UPDATE == 强>
不幸的是发布的链接已经死了。但是,解决方案非常简单。据我所知,它经历了以下步骤:
==更新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