0

任何具有 setHTML 方法的小部件都可能给安全系统带来漏洞,但如果我们验证 String & 只接受一些有限的 html 标签,例如<b>, <i>.... 然后我们把这个字符串放到 setHTML 方法中。

然后我的问题是“如果我们这样做仍然安全吗”例如,我们检查字符串文本以确保它只包含一些有限的 html 标记<b>, </b>, <i>, </i>..。如果字符串文本包含其他标签,那么我们不会让用户输入该文本。然后我们使用: html1.setHTML(text); 而不是html1.setHTML(SafeHtmlUtils.fromString(text))

我不知道为什么html1.setHTML(SafeHtmlUtils.fromString(text))不生成格式化文本,当我在eclipse中运行它时它只显示纯文本?例如

html1.setHTML(SafeHtmlUtils.fromString("<b>text</b>")) 

将有纯文本结果,而不是具有正确 html 格式<b>text</b>的粗体文本“ text ”

4

1 回答 1

2

你想清理html,而不是逃避它。该fromString方法旨在转义字符串 - 如果用户键入 enter a < b,但忘记了空格,然后添加>c,则您不希望 c 为粗体并且 b 完全丢失。进行转义以实际呈现给定的字符串,假设它是文本。

在光谱的另一端,您可以使用fromTrustedStringwhich 告诉 GWT 您绝对信任数据源,并且您将允许它做任何事情。对于来自用户的任何数据,通常不应这样做。

在所有这些方面的某个地方,我们有sanitation,在这个过程中,您获取一个应该是 HTML 的字符串并确保它是安全的,而不是像对待文本一样对待它,或者隐含地信任它。这很难做好——任何有style属性的标签都可能攻击你(这就是为什么 GWT 有SafeStylelike SafeHtml,任何有 uri、url 或 href 的标签都可以用来攻击(因此SafeUri),以及浏览器的任何属性视为回调onclick之类的可用于运行 JavaScript。该HtmlSanitizer类型旨在能够做到这一点。

至少从 GWT 2.4 开始,有一个内置的实现SimpleHtmlSanitizer。此类将某些 html 标签列入白名单,包括 your<b><i>标签,以及其他一些标签。属性被完全删除,因为在很多情况下它们可能不安全。正如类名所暗示的,这只是解决此问题的一种简单方法——更复杂和更深入的方法可能更符合原始代码,但这也带来了允许不安全 HTML 内容的风险。

于 2013-05-03T04:32:54.490 回答