Velocity安全输出帮助

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)") 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值