2010-07-05 95 views
2

一兩個星期前我開始認真地使用Zend Framework,並且無法用Zend_View :: escape()手動轉義。 有沒有人知道如何在模板(Zend_View模板)中自動轉義變量而不使用$ this-> escape()或其他任何棘手的方法,如輸出緩衝和PREG替換* .phtml文件。什麼是自動逃脫Zend_View中變量的最佳方式?

我想知道在這種情況下的最佳做法。

+0

將被添加Zend Framework 2.0 – opHASnoNAME 2010-07-06 04:06:36

回答

0

你說「自動」,所以我相信這意味着當你做的時候echo $ this-> var;你希望它逃脫。那麼,如果是這樣的話,也許你可以在變量設置爲視圖時進行轉義。 AFAIK它是在Zend_View_Abstract類的__set魔術方法*(大約300行)完成的。不建議更改核心ZF代碼,所以您可以通過擴展Z_V_A或Z_V並僅覆蓋__set方法。 *我不是100%確定Z_V_A :: __ set是params分配給視圖的唯一地方,但我認爲它應該是。想不到還有其他的地方。

編輯:個人而言,我會避免這一點,只是堅持良好的'$ this-> escape()。更多的打字,但更少的魔術在後臺進行。

+0

感謝您的建議。但是我希望這個案例有一個很激烈的解決方案。 如果您手動編寫好的'$ this-> escape(),則可能會忘記轉義並使您的應用程序XSS易受攻擊。對我而言,「最大的麻煩」是讓ZF對Smarty或symfony用戶有多酷(你可以用它們自動轉義輸出)。 – chikaram 2010-07-06 03:31:17

0

你已經要求最佳做法,那麼你在做什麼已經是它了。 等到您想要顯示數據時才修改它,僅出於輸出原因。

我知道你會發現書寫 - > escape()每次都很乏味,但它仍然是一條路。

如果您在哪裏自動轉義所有內容,那麼您有一天會遇到問題,當您需要/需要未轉義的數據時。

+0

我明白你的觀點。但是通過symfony和Smarty,你不需要費心編寫那些單調乏味的東西。 – chikaram 2010-07-06 03:36:52

2

您可以擴展Zend_View以創建自動創建事件的自定義視圖類,或者您可以使用視圖幫助器打開/關閉自動隱藏。

我已經寫了博文這件事,與示例代碼兩種方法: How to automatically escape template variables in Zend_View

+0

非常感謝。該方法看起來很好。但問題是它無法轉義方法返回的值。 E.G.在我的模板中,我走了: <? foreach($ this-> comment as $ comment):?>

<?= $ comment-> getText()?>

<? endforeach?>。 我不想像 escape($ comment-> getTitle())?>這樣的代碼,我認爲這真的很痛苦。如果你有任何其他想法,我希望你讓我知道。 – chikaram 2010-07-06 03:15:32

+0

+1 heh Jani,我應該更徹底地閱讀你的博客:P – robertbasic 2010-07-06 06:21:17

+0

我不認爲你可以自動從函數中返回返回的值。這是Zend_View如何工作的限制。短標籤解析器處理視圖腳本並對其進行更改,以便短標籤可以工作,但您可能也可以使用類似的方法向所有內容添加轉義調用,但這可能會很慢且棘手。 – 2010-07-06 08:59:57

2

在我們在建立一個自定義流的包裝,自動轉義所有的視圖變量,以最小的性能損失派克項目!您仍然可以獲取原始值:

<?=~ $variable ?>

公告的 「〜」 字符。結帳http://code.google.com/p/php-pike/wiki/Pike_View_Stream

我知道你說你想避免「棘手的方式像輸出緩衝和PREG替換*一個.phtml文件。」,但我仍然認爲這是解決汽車在Zend框架1

逃脫一個非常巧妙的方法
0

ZendX_View_Autoescaping,這個項目爲您提供了一個ViewRenderer,並自動轉換所有分配的視圖變量。

https://github.com/jensklose/ZendX_View_Autoescaping

試試看!

它支持:

  • 逃逸到深數據結構
  • 逸出數組鍵
  • 可能性切換逃逸上下文(HTML,JSON,NOFILTER)
相關問題