您将如何将 SafeHtml 与链接结合使用?
场景:我们的用户可以输入可能包含链接的无格式文本,例如I like&love http://www.stackoverflow.com
。我们希望在 GWT 中安全地呈现此文本,但使链接可单击,例如I like&love <a="http://www.stackoverflow.com">stackoverflow.com</a>
。除了在 GWT 前端渲染文本之外,我们还希望通过电子邮件发送文本,其中的链接也应该是可点击的。
到目前为止,我们考虑了以下选项:
- 将完整文本以 HTML 形式存储在后端,并让前端假设其编码正确 (
I like&love <a="http://www.stackoverflow.com">stackoverflow.com</a>
) -> 引入 XSS 漏洞 - 在后端存储纯文本,但将链接存储为 HTML (
I like&love <a="http://www.stackoverflow.com">stackoverflow.com</a>
) 并使用 HtmlSanitizer在前端 - 在后端存储链接的纯文本和特殊编码 (
I like&love [stackoverflow.com|http://www.stackoverflow.com]
),并在前端使用自定义 SafeHtml 生成器
对我们来说,第三个选项看起来最干净,但它似乎需要最多的自定义代码,因为我们无法利用 GWT 的 SafeHtml 基础设施。
有人可以分享如何最好地解决这个问题吗?还有其他我们目前没有考虑过的选择吗?
最佳答案
为什么不完全按照用户输入的方式存储文本,并在将其转换为输出时执行任何特殊处理(例如,用于发送电子邮件、创建 PDF 等)。这是最自然的方法,您不必撤消任何特殊处理,例如当您向用户提供编辑字符串时。
作为一般规则,我始终只对直接传输/存储/输出目标执行编码/转义/转换。偏离这一规则的原因很少,其中之一可能是性能,例如在数据库中缓存转换后的值。 (在这些情况下,我认为最好为数据库字段指定一个特定名称,例如“text_htmltransformed” - 这可以避免“过度转义”,这与不转义一样有害。)
注意:转义/编码不能替代输入验证。
关于java - 使用 SafeHtml 进行 anchor ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13601858/