任何具有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 ”
答案 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内容的风险。