GWT安全HTML、XSS和最佳实践

5
OWASP的专家强调,必须对放置不受信任数据的HTML文档部分(如body、attribute、JavaScript、CSS或URL)使用转义语法。请参阅OWASP - XSS。他们的API(由ESAPI团队开发)随后为此提供了每个上下文的编码器。

ESAPI.encoder().encodeForHTML("input"); ESAPI.encoder().encodeForHTMLAttribute("input"); ESAPI.encoder().encodeForJavaScript("input"); ESAPI.encoder().encodeForCSS("input"); ESAPI.encoder().encodeForURL("input");

随后,这使得开发人员能够处理基于DOM的XSS问题。
所以我的问题是,GWT的safehtml包如何处理这个问题,还是仅关注HTML编码?
1个回答

4
SafeHtmlTemplates将完成此操作(仅限客户端,因为它依赖于GWT generator)。 它将使用“标记串”解析器解析HTML片段,该解析器将推断上下文并在参数不能在此上下文中使用时记录警告或抛出异常(例如,它会防止在脚本上下文中使用所有占位符)。 尽管如此,这仍在变化中(SafeUri仍在审核中,而SafeStyles仍受到严格限制),但它将逐渐完善(我认为应该在GWT 2.4中)。

否则:

  • SafeHtmlUtils将转义所有的<>&'",因此结果对于“HTML”和“HTML属性”上下文是安全的
  • SafeHtmlBuilder的各种追加方法只会在内部调用SafeHtmlUtils
  • UriUtils提供工具来清理不安全的URI(如果您正在构建HTML字符串,仍需要进行SafeHtmlUtils或等效处理,而不是直接使用值作为图像源或锚的href)。
  • SafeStyles本身并没有提供任何特定内容,但SafeHtmlTemplates仅允许它出现在CSS上下文的开头,并在您尝试将其他任何内容放入CSS上下文时记录警告。预计SafeStylesBuilder将被扩展为类型安全方法,以帮助构建格式良好的CSS。
  • 我一直在开发一个类似于SafeStyles但在URL上下文中的SafeUri接口。到时候,SafeHtmlTemplates将仅允许使用SafeUriString作为URL属性的完整值,通过UriUtilsString转换为安全的值。
简而言之,我认为你问题的答案是:是的,GWT的safehtml包可以满足这个需求;但是你可能需要始终使用最新版本的GWT(至少在未来一年内)才能确保安全。

1
所以基本上,当处理除HTML之外的上下文时,我会使用SafeHTMLTemplates,但您建议不要依赖它来安全地编码GWT 2.3中的URL和样式?最后,在GWT中考虑基于DOM的XSS是否有必要,因为我们有能力直接设置DOM元素的内部HTML? - Markus Coetzee
1
没有什么神奇的,SafeHtmlTemplates所做的一切都可以由您自己完成;但是SafeHtmlTemplates自动执行了许多检查,您必须通过检查代码才能完成这些检查。目前(GWT2.3),它还不足以检查CSS(我不确定它是否永远会这样做,计划是为您提供一个帮助您构建安全CSS的工具)。至于URL,它将调用'UriUtils.sanitizeUri',因此您将很安全,但是它会清除一些安全的URI(例如,您知道是安全的数据URI),并且会有一些特殊情况它可能会保持原样而不安全(请参见SafeUri代码审查)。 - Thomas Broyer
1
最后:DOM-based CSS 在 GWT 中确实是需要关注的问题,这也是为什么首先添加了 SafeHtml 等工具的原因。每当您可以设置元素的 innerHTML 时,请尝试使用 SafeHtml 工具来构建它。它永远不会取代审核您的代码,但应该在此过程中大有帮助。 - Thomas Broyer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接