使用SafeHtml的锚点

时间:2012-11-28 09:32:40

标签: java gwt xss

您如何将SafeHtml与链接结合使用?

场景:我们的用户可以输入可能包含链接的无格式文本,例如I like&love http://www.stackoverflow.com。我们希望在GWT中安全地呈现此文本,但使链接可以点击,例如I like&amp;love <a="http://www.stackoverflow.com">stackoverflow.com</a>。除了在GWT前端渲染文本之外,我们还希望通过电子邮件发送文本,其中链接也应该是可点击的。

到目前为止,我们考虑了以下选项:

  1. 将完整文本作为HTML存储在后端,让前端假设它已正确编码(I like&amp;love <a="http://www.stackoverflow.com">stackoverflow.com</a>) - &gt;介绍XSS漏洞
  2. 在后端存储纯文本,但链接为HTML(I like&love <a="http://www.stackoverflow.com">stackoverflow.com</a>),并在前端使用HtmlSanitizer
  3. 在后端存储链接(I like&love [stackoverflow.com|http://www.stackoverflow.com])的纯文本和特殊编码,并在前端使用自定义SafeHtml生成器
  4. 对我们来说,第三个选项看起来最干净但似乎需要最自定义的代码,因为我们无法利用GWT的SafeHtml基础架构。

    有人可以分享如何最好地解决问题吗?到目前为止还有其他选择吗?

1 个答案:

答案 0 :(得分:2)

为什么不完全按照用户输入的方式存储文本,并在将其转换为输出时执行任何特殊处理(例如,用于发送电子邮件,创建PDF,...)。这是最自然的方法,您不必撤消任何特殊处理,例如当您提供用户编辑字符串时。

作为一般规则,我总是只为立即传输/存储/输出目标执行编码/转义/转换。偏离此规则的理由很少,其中一个可能是性能,例如:在DB中缓存转换后的值。 (在这些情况下,我认为最好给DB字段一个特定的名称,比如'text_htmltransformed' - 这可以避免'过度使用',这可能与没有转义一样有害。)

注意:转义/编码不能替代输入验证。