【问题标题】:GWT Safe HTML Framework: When to use, and why?GWT 安全 HTML 框架:何时使用,为什么使用?
【发布时间】:2024-01-20 06:31:01
【问题描述】:

在阅读 JavaDocs 和各种 GWT 文章时,我偶尔会遇到以下 Safe* 类:

  • SafeHtml
  • SafeHtmlBuilder

看起来SafeHtml 在创建新的WidgetComposite 时以某种方式使用,并有助于确保小部件/复合不会在客户端执行任何脚本。是这种情况,还是我离谱?有人可以提供SafeHtml 在实际中正确使用的代码示例吗?

如果是这样,那么SafeHtmlBuilder 的意义何在?您是否在 Widget 中使用它以某种方式“构建”安全的 HTML?

【问题讨论】:

    标签: java html gwt xss


    【解决方案1】:

    查看SafeHtml 的最简单方法是使用String,其中任何HTML 标记都已适当转义。这可以防止跨站点脚本 (XSS) 攻击,因为它可以确保,例如,如果有人以 <SCRIPT>alert('Fail')</SCRIPT> 的形式输入他们的姓名,这是在呈现您的页面时显示的文本,而不是正在运行的 JavaScript。

    所以不要有类似的东西:

    String name = getValueOfName();
    HTML widget = new HTML(name);
    

    你应该使用:

    String name = getValueOfName();
    HTML widget = new HTML(SafeHtmlUtils.fromString(name));
    

    SafeHtmlBuilder 类似于StringBuilder,只是它会自动转义您添加的字符串中的 HTML 标记。所以扩展上面的例子:

    String name = getValueOfName();
    SafeHtmlBuilder shb = new SafeHtmlBuilder();
    shb.appendEscaped("Name: ").appendEscaped(name);
    HTML widget = new HTML(shb.toSafeHtml());
    

    这是一个很好的guide to SafeHtml in the GWT documentation,值得一读。

    【讨论】:

      【解决方案2】:

      SafeHtmlBuilderSafeHtmlStringBuilderString

      至于Safe* API,在处理 HTML(或SafeStyles 的 CSS,或SafeUriUriUtils 的 URL)时使用它,更精确地从要构建的部分构建 HTML/CSS/URL馈送到浏览器进行解析,no例外。

      实际上,我们最近正在讨论是否弃用 Element.setInnerHtml 和其他类似的 API (HasHTML) 以支持 Element.setInnerSafeHtml 等 (HasSafeHtml)。

      【讨论】:

      • 感谢@Thomas Broyer (+1) - 这是有道理的,虽然我错过了与小部件的联系。我认为 GWT 应用程序的整个演示是通过在显示区域内将小部件组合在一起,然后使用 CSS 来布局不同的显示区域来实现的。您能帮我理解 Safe* API 与小部件的连接吗?它们是要一起使用的吗?还是它们完全适合不同的用例?再次感谢!
      • 一些小部件将在内部使用Safe* API,并可能将其暴露在外部(HasHTML / HasSafeHtml)。细胞大量使用SafeHtml。它们是不同但互补的 API。
      • 再次感谢 (+1) - 最后一次跟进:根据您的回答(“它们是不同但互补的 API...”)听起来好像有一些用例SafeHtml 涉及创建与小部件无关的客户端 HTML。您能否给我一些用例,其中一个人会使用 SafeHtml 在客户端构建不使用小部件/复合材料或与小部件/复合材料有任何关系的东西?我想我不理解小部件上下文之外的 SafeHtml。再次感谢!