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
在创建新的Widget
或Composite
时以某种方式使用,并有助于确保小部件/复合不会在客户端执行任何脚本。是这种情况,还是我离谱?有人可以提供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】:SafeHtmlBuilder
是 SafeHtml
,StringBuilder
是 String
。
至于Safe*
API,在处理 HTML(或SafeStyles
的 CSS,或SafeUri
和 UriUtils
的 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() 函数