一兩個星期前我開始認真地使用Zend Framework,並且無法用Zend_View :: escape()手動轉義。 有沒有人知道如何在模板(Zend_View模板)中自動轉義變量而不使用$ this-> escape()或其他任何棘手的方法,如輸出緩衝和PREG替換* .phtml文件。什麼是自動逃脫Zend_View中變量的最佳方式?
我想知道在這種情況下的最佳做法。
一兩個星期前我開始認真地使用Zend Framework,並且無法用Zend_View :: escape()手動轉義。 有沒有人知道如何在模板(Zend_View模板)中自動轉義變量而不使用$ this-> escape()或其他任何棘手的方法,如輸出緩衝和PREG替換* .phtml文件。什麼是自動逃脫Zend_View中變量的最佳方式?
我想知道在這種情況下的最佳做法。
你說「自動」,所以我相信這意味着當你做的時候echo $ this-> var;你希望它逃脫。那麼,如果是這樣的話,也許你可以在變量設置爲視圖時進行轉義。 AFAIK它是在Zend_View_Abstract類的__set魔術方法*(大約300行)完成的。不建議更改核心ZF代碼,所以您可以通過擴展Z_V_A或Z_V並僅覆蓋__set方法。 *我不是100%確定Z_V_A :: __ set是params分配給視圖的唯一地方,但我認爲它應該是。想不到還有其他的地方。
編輯:個人而言,我會避免這一點,只是堅持良好的'$ this-> escape()。更多的打字,但更少的魔術在後臺進行。
感謝您的建議。但是我希望這個案例有一個很激烈的解決方案。 如果您手動編寫好的'$ this-> escape(),則可能會忘記轉義並使您的應用程序XSS易受攻擊。對我而言,「最大的麻煩」是讓ZF對Smarty或symfony用戶有多酷(你可以用它們自動轉義輸出)。 – chikaram 2010-07-06 03:31:17
你已經要求最佳做法,那麼你在做什麼已經是它了。 等到您想要顯示數據時才修改它,僅出於輸出原因。
我知道你會發現書寫 - > escape()每次都很乏味,但它仍然是一條路。
如果您在哪裏自動轉義所有內容,那麼您有一天會遇到問題,當您需要/需要未轉義的數據時。
我明白你的觀點。但是通過symfony和Smarty,你不需要費心編寫那些單調乏味的東西。 – chikaram 2010-07-06 03:36:52
您可以擴展Zend_View以創建自動創建事件的自定義視圖類,或者您可以使用視圖幫助器打開/關閉自動隱藏。
我已經寫了博文這件事,與示例代碼兩種方法: How to automatically escape template variables in Zend_View
非常感謝。該方法看起來很好。但問題是它無法轉義方法返回的值。 E.G.在我的模板中,我走了: <? foreach($ this-> comment as $ comment):?>
<?= $ comment-> getText()?>
<? endforeach?>。 我不想像= $this-> escape($ comment-> getTitle())?>這樣的代碼,我認爲這真的很痛苦。如果你有任何其他想法,我希望你讓我知道。 – chikaram 2010-07-06 03:15:32+1 heh Jani,我應該更徹底地閱讀你的博客:P – robertbasic 2010-07-06 06:21:17
我不認爲你可以自動從函數中返回返回的值。這是Zend_View如何工作的限制。短標籤解析器處理視圖腳本並對其進行更改,以便短標籤可以工作,但您可能也可以使用類似的方法向所有內容添加轉義調用,但這可能會很慢且棘手。 – 2010-07-06 08:59:57
在我們在建立一個自定義流的包裝,自動轉義所有的視圖變量,以最小的性能損失派克項目!您仍然可以獲取原始值:
<?=~ $variable ?>
公告的 「〜」 字符。結帳http://code.google.com/p/php-pike/wiki/Pike_View_Stream
我知道你說你想避免「棘手的方式像輸出緩衝和PREG替換*一個.phtml文件。」,但我仍然認爲這是解決汽車在Zend框架1
逃脫一個非常巧妙的方法ZendX_View_Autoescaping
,這個項目爲您提供了一個ViewRenderer,並自動轉換所有分配的視圖變量。
https://github.com/jensklose/ZendX_View_Autoescaping
試試看!
它支持:
將被添加Zend Framework 2.0 – opHASnoNAME 2010-07-06 04:06:36