GWT 安全 HTML 框架:何时使用,为啥使用?

Posted

技术标签:

【中文标题】GWT 安全 HTML 框架:何时使用,为啥使用?【英文标题】:GWT Safe HTML Framework: When to use, and why?GWT 安全 HTML 框架:何时使用,为什么使用? 【发布时间】:2012-10-13 05:00:54 【问题描述】:

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

Safehtml SafeHtmlBuilder

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

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

【问题讨论】:

【参考方案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。再次感谢!

以上是关于GWT 安全 HTML 框架:何时使用,为啥使用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥以及何时使用 Django mark_safe() 函数

为啥 GWT RPC 需要同步接口?

Ext-GWT TreeGrid 间接调用了 GWT-RPC 回调?为啥?

GWT Spring 安全集成(纯 GWT,无 JSP)

为啥在调试模式下启动 GWT 时,我的断点不会中断

对于 GWT GAE Java 应用程序,这种 GWT/RPC 安全方法的安全性如何?