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)")
Velocity安全输出帮助
最新推荐文章于 2023-04-27 14:55:19 发布