簡體   English   中英

Zend 框架的自動變量轉義器

[英]Automatic variable escaper for Zend Framework

您能為 Zend Framework 1.x 的自動視圖變量 escaping 推薦任何好的解決方案嗎?

到目前為止我已經嘗試過:

  • ZF2實施; 看起來它不會像這樣轉義變量語法: $this->var->object()->string
  • gnix-view ,非常好,但是有一個討厭的遞歸錯誤
  • 基於view streams的自定義解決方案,類似於Rob Allen 的 escaper ,但使用 regex 解析語法總是失敗
  • Twig(對視圖助手和布局沒有很好的支持)

這是我的解決方案

/**
 * 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);
        }
    }
}

您需要做的就是在引導程序中將其設置為您的視圖。

如果我想制作一個自動轉義器,我會創建一個在postDispatch中運行的 ZF 插件:

postDispatch() 在調度程序調度操作后調用。 此回調允許代理或過濾器行為。 通過改變請求並重置它的調度標志(通過 Zend_Controller_Request_Abstract::setDispatched(false)),可以指定一個新的動作來調度。 資源

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);
    }
}

我希望無論上述示例的狀態如何,我都能解釋我的想法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM