在阅读Javadocs和各种GWT文章时,我偶尔会遇到以下Safe*
类:
-
SafeHtml
-
SafeHtmlBuilder
在创建新的Widget
或Composite
时,看起来SafeHtml
是以某种方式使用的,并有助于确保小部件/复合材料不会在客户端端执行任何脚本。是这种情况,还是我离基地之外?有人可以提供SafeHtml
的代码示例吗?
如果是这样,那么SafeHtmlBuilder
的意义是什么?您是否在小部件内使用它来以某种方式"堆积"安全html?
查看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());
这是GWT文档中SafeHtml
的好指南,值得一读。
SafeHtmlBuilder
是 SafeHtml
StringBuilder
是 String
。
至于Safe*
API,每当使用HTML(或SafeStyles
的CSS或SafeUri
和UriUtils
的URL)时使用它,更精确地构建了HTML/CSS/URL,从供应到浏览器的html/css/url,用于放弃,以供应放弃,否异常。
实际上,我们最近在讨论是否弃用Element.setInnerHtml
和其他类似的API(HasHTML
),而不是Element.setInnerSafeHtml
等(HasSafeHtml
)。