Zend Framework的自动变量escaper

时间:2011-06-29 13:00:18

标签: php zend-framework escaping xss zend-view

你能为Zend Framework 1.x的自动视图变量转义推荐任何好的解决方案吗?

到目前为止我已尝试过:

  • ZF2实施;看起来它不会像以下那样转义变量语法:$this->var->object()->string
  • gnix-view,非常好,但有一个讨厌的递归错误
  • 基于view streams的自定义解决方案,类似于Rob Allen's escaper,但使用正则表达式解析语法始终失败
  • Twig(对视图助手和布局没有很好的支持)

2 个答案:

答案 0 :(得分:1)

这是我的解决方案

/**
 * Purifies all data passed to view
 *
 * @author miholeus
 */
class HTMLPurifier_View extends Zend_View {
    protected $_vars = array();

    public function __set($key, $val)
    {

        if(is_string($val)) {
            $purified = $this->escape($val);
        } elseif(is_array($val)) {
            $purified = array_map(array($this, 'traverseSingle'), $val);
        } else { // other types: integers, bools, objects
            $purified = $this->traverseSingle($val);
        }

        $this->_vars[$key] = array(
            'raw' => $val,
            'purified' => $purified
        );

        return $this;
    }

    public function getRaw($key)
    {
        if(isset($this->_vars[$key])) {
            return $this->_vars[$key]['raw'];
        }
        return null;
    }

    public function __get($key)
    {
        if(isset($this->_vars[$key])) {
            return $this->_vars[$key]['purified'];
        }
        return null;
    }

    private function traverseSingle($element)
    {
        if(is_object($element)) {
            $reflect = new ReflectionObject($element);
            foreach ($reflect->getProperties(ReflectionProperty::IS_PUBLIC) as $prop) {
              $element->{$prop->getName()} = $this->escape($element->{$prop->getName()});
            }
            return $element;
        } else {
            return $this->escape($element);
        }
    }
}

您需要做的就是将其设置为引导程序中的视图。

答案 1 :(得分:0)

如果我想创建一个自动转发器,我会创建一个在postDispatch中运行的ZF插件:

在调度程序调度操作后调用

postDispatch()。此回调允许代理或过滤器行为。通过更改请求并重置其调度标志(通过Zend_Controller_Request_Abstract :: setDispatched(false)),可以指定一个新的操作来进行调度。 source

mybe使用htmlprifier会是一个聪明的工作:)

class Automatic_Escaper extends Zend_Controller_Plugin_Abstract{
   public function postDispatch(Zend_Controller_Request_Abstract $request)
    {
        $response = $this->getResponse();
        $htmlpurifier = Zend_Registry::get('purifier');
        $safe = $htmlpurifier->purify($response);
        return $this->setResponse($safe);
    }
}

我希望无论以上样本的状态如何,我都会解释我的想法。