对于SafeHtml,我们是否需要清理GWT <img src="link"/>标签中的“链接”?

时间:2013-05-06 05:44:46

标签: image gwt tags sanitize

我有一个文本框,允许用户放置图片链接(例如:http://abc.test.gif)&amp;另一个允许用户放置备用文本的文本框(例如:&#34;这是test.gif&#34;),&amp;提交按钮。

当用户点击提交按钮时,该程序将生成<img src="http://abc.test.gif" alt="This is test.gif">此字符串&amp;将其存储到数据库中供以后使用。

我的问题是:我是否需要清理imagelink "http://abc.test.gif"&amp; alt标记"This is test.gif"

中的文字

例如,我是否需要使用UriUtils.isSafeUri("http://abc.test.gif");&amp; SafeHtmlUtils.fromString("This is test.gif"

1 个答案:

答案 0 :(得分:3)

您故意允许用户输入他想要的任何内容,以及src标记的altimg属性。这确实对任何类型的XSS攻击都是开放的。请查看here,了解一些在最近的浏览器中仍然有效的示例。

此外,您将字符串存储在数据库中供以后使用(猜测),因此攻击可能会在以后使用此类字符串在DOM中创建节点时发生,结果更加难以预测。

一种解决方案可能是只在数据库中存储URL和替代字符串(如果有正确的输入验证),并在您生成安全 img代码段时需要它,使用如下的简单模板(或以编程方式使用SafeHtmlBuilder)。

public interface Template extends SafeHtmlTemplates {
  @Template("<img src=\"{0}\" alt=\"{1}\"/>")
  SafeHtml img(SafeUri uri, SafeHtml alternativeText);
}

用作:

template.img(
    UriUtils.fromString(yourValidatedDbUrl),
    SafeHtmlUtils.fromString(yourValidatedAlternativeText));

这样你:

  • 验证用户输入;
  • 仅存储经过验证的值(按原样);
  • 仅在真正需要时才以安全的方式生成img片段。