Veloctiy安全輸出幫助

Velocity安全輸出幫助 

    * html輸出 什麼都不執行, 按原始格式輸出。 他並不是真正的不執行任何變化, 因爲他會執行xss的過濾動作。一個非常複雜的安全處理過程, 如果不是輸出HTML, 請勿使用。 這個表示將會消耗大量的CPU處理。 

          #SHTML($html) 

    * xml編碼輸出, 將會執行 xml encode輸出 

          #SXML($xml) 



    * js編碼輸出 , 將會執行javascript encode輸出 

         #SJS($js) 

    * 純文本編碼輸出, 將會執行html encode.  就是我們通常的使用. 

        $text 

    * 爲了避免發生歧義, #ZHTML雖然是不轉義, 但是我們明確說的是HTML, 但是, 如果真有不需要轉義的情況出現, 我們可以使用

        #SLITERAL($text) 
        tips: literal – 照字面的;原義的. 

    有一點需要強調的是, 我們所有宏的執行, 如果輸入的是 null, 那麼宏執行後是”” 這點是無法被修正的障礙。出現這樣的可能性,而且要被velocity腳本使用null的機會是很少的。 因爲加這個宏就意味着用戶準備輸出了。 



    加一個S是爲了儘量避免和應用定義的宏出現衝突, 沒有別的含義. 但是我們仍然 
有幾個地方需要我們注意的地方: 

    * 擴展實現的是編碼輸出String對象, 如果你輸出的不是String對象, 這些宏操作將會失效,這個是爲了提高系統的編碼性能,採取的態度。 如果一個對象沒有重新實現toString()的,這個對象的輸出是不可能有html編碼的問題的。因爲Object.toString實現的是對象地址, 另外實現了toString的方法,我們姑且認爲是安全, 這個雖然嚴格意義上是不正確. 

    * 如何避免一個數據被多次encode。 

   1. 首先我們假設 $text="s&" 
      $stringUtil.getXXX($text) 

      這個形式輸出是 s& 
   2. $stringUtil.getXXX("$text") 
      這個形式輸出是 s& 

      爲什麼會這樣呢,""是告訴velocity, 先輸出,後把參數送給#stringUtil.getXXX. 這是一個非常需要注意的地方,這個地方導致了大量的地方需要修改的地方。也是目前最無奈的地方。這個這個會造成一些變形的特殊情況, 比如$stringUtil.equals("$text", "&")這樣情況就是, "$text", 這個已經發生htlml encode, 然而 "&"是常量,常量是無法被轉義的,因此這個就是發生嚴重的bug. 
      解決的辦法是這麼寫: 
      $stringUtil.equals($text, "&") 
   3. $stringUtil.getXXX("the pro: $text") 
      常量與輸出的混合. 解決這個問題的辦法是:$stringUtil.getXXX("the pro: #ZLITERAL($text)")

發佈了75 篇原創文章 · 獲贊 32 · 訪問量 80萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章