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

你可能感兴趣的:(安全)