对于setHTML()方法,它是否仍然安全如果我们不使用Safehtml但我们验证字符串&只接受一些有限的html标签(Gwt)?

时间:2013-05-02 19:01:16

标签: html gwt

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

然后我的问题是“如果我们这样做,它仍然是安全的” 例如,我们检查String文本以确保它只包含一些有限的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>")) 

将使用纯文本结果<b>text</b>而不是带有正确html格式的粗体文字“ text

1 个答案:

答案 0 :(得分:2)

你想清理 html,而不是逃避它。 fromString方法意味着转义字符串 - 如果用户输入a < b,但忘记了空格,则添加>c,您不需要c要加粗,b要完全丢失。进行转义以实际呈现给定的字符串,假设它是文本。

在频谱的另一端,您可以使用fromTrustedString告诉GWT您绝对信任数据源,并且您将允许它执行任何操作。对于来自用户的任何数据,通常不应该这样做。

在所有的一边,我们有 sanitation ,这个过程中你将的字符串意味着是HTML,并确保它是安全的而不是将其视为文本,或隐含地信任它。这很难做得很好 - 任何具有style属性的标记都可能会攻击你(这就是为什么GWT有SafeStyle SafeHtml的原因,任何带有uri,url或href的标记可用于攻击(因此SafeUri),浏览器视为回调的任何属性(如onclick等)都可用于运行JavaScript。HtmlSanitizer类型是指能够做到这一点。

至少在GWT 2.4中有一个内置的实现 - SimpleHtmlSanitizer。此类会将某些html标记列入白名单,包括您的<b><i>标记以及其他一些标记。属性被完全删除,因为有太多的情况可能不安全。正如类名所示,这只是解决此问题的一种简单方法 - 对于原始代码而言,更复杂和更深入的方法可能更为真实,但这也带来了允许不安全的HTML内容的风险。