在阅读JavaDocs和各种GWT文章时,我偶尔会遇到以下Safe*
类:
SafeHtml
SafeHtmlBuilder
在创建新的SafeHtml
或Widget
时,似乎以某种方式使用了Composite
,并且有助于确保Widget / Composite不会在客户端执行任何脚本。是这种情况,还是我离开基地?有人可以提供正确使用SafeHtml
的代码示例吗?
如果是这样,那么SafeHtmlBuilder
的重点是什么?你是否在Widget中使用它以某种方式“建立”安全的HTML?
答案 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));
SafeHtmlBuilder
与StringBuilder
类似,只是它会自动转义您添加的字符串中的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)
SafeHtmlBuilder
是SafeHtml
StringBuilder
到String
的内容。
对于Safe*
API,只要您处理HTML(或SafeStyles
的CSS或SafeUri
和UriUtils
的网址),就可以使用它,更准确地说是构建HTML来自部分的/ CSS / URL将被提供给浏览器进行解析,无例外。
实际上,我们最近讨论了是否弃用Element.setInnerHtml
和其他类似的API(HasHTML
)而转而使用Element.setInnerSafeHtml
等(HasSafeHtml
)。