GWT安全HTML框架:何时使用,为什么?

时间:2012-10-23 09:34:33

标签: java html gwt xss

在阅读JavaDocs和各种GWT文章时,我偶尔会遇到以下Safe*类:

  • SafeHtml
  • SafeHtmlBuilder

在创建新的SafeHtmlWidget时,似乎以某种方式使用了Composite,并且有助于确保Widget / Composite不会在客户端执行任何脚本。是这种情况,还是我离开基地?有人可以提供正确使用SafeHtml的代码示例吗?

如果是这样,那么SafeHtmlBuilder的重点是什么?你是否在Widget中使用它以某种方式“建立”安全的HTML?

2 个答案:

答案 0 :(得分:9)

查看SafeHtml的最简单方法是String,其中任何HTML标记都已适当转义。这可以防止跨站点脚本(XSS)攻击,因为它确保,例如,如果某人以<SCRIPT>alert('Fail')</SCRIPT>形式输入其名称,这是在呈现页面时显示的文本,而不是运行的JavaScript

所以不要像以下那样:

String name = getValueOfName();
HTML widget = new HTML(name);

您应该使用:

String name = getValueOfName();
HTML widget = new HTML(SafeHtmlUtils.fromString(name));

SafeHtmlBuilderStringBuilder类似,只是它会自动转义您添加的字符串中的HTML标记。所以扩展上面的例子:

String name = getValueOfName();
SafeHtmlBuilder shb = new SafeHtmlBuilder();
shb.appendEscaped("Name: ").appendEscaped(name);
HTML widget = new HTML(shb.toSafeHtml());

这是一个值得一读的好guide to SafeHtml in the GWT documentation

答案 1 :(得分:8)

SafeHtmlBuilderSafeHtml StringBuilderString的内容。

对于Safe* API,只要您处理HTML(或SafeStyles的CSS或SafeUriUriUtils的网址),就可以使用它,更准确地说是构建HTML来自部分的/ CSS / URL将被提供给浏览器进行解析,例外。

实际上,我们最近讨论了是否弃用Element.setInnerHtml和其他类似的API(HasHTML)而转而使用Element.setInnerSafeHtml等(HasSafeHtml)。