Angular $ sce vs外部语言环境文件中的HTML

Phi*_*ley 7 javascript xss angularjs

关于ng-bind-html将Angular应用程序从1.0.8升级到1.2.8的问题:

我将语言环境字符串存储在名为en_GB.json,fr_FR.json等的文件中.到目前为止,我已允许在语言环境字符串中使用HTML,以允许团队编写本地化内容以应用基本样式或添加内联锚标记.这将导致以下示例JSON:

{
  "changesLater":     "<strong>Don't forget</strong> that you can always make changes later." 
  "errorEmailExists": "That email address already exists, please <a href=\"login\">sign in</a> to continue."
}
Run Code Online (Sandbox Code Playgroud)

当使用这些字符串时ng-bind-html="myStr",我明白我现在需要使用$sce.trustAsHtml(myStr).我甚至可以按照这个StackOverflow应答中的建议编写一个过滤器,这将导致使用ng-bind-html="myStr | unsafe".

问题:

  1. 通过做这样的事情,我的应用程序现在是不安全的吗?如果是这样,攻击者如何利用这个?
  2. 如果显示的HTML字符串的来源是用户(即将向其他用户显示的博客文章后评论),我可以理解潜在的漏洞利用,但如果我只显示来自其他用户的HTML,我的应用程序真的会面临风险JSON文件托管在同一个域上?
  3. 我还有什么其他方法可以在角度应用程序中实现外部加载内容字符串的标记吗?

ale*_*exp 4

  1. 您并没有降低您的应用程序的安全性。您已经使用 ng-bind-html-unsafe 的旧方法在页面中插入了 HTML。您仍然在做同样的事情,只不过现在您必须明确信任HTML 的来源,而不是仅仅指定模板的该部分可以输出原始 HTML。要求使用 $sce 使得意外接受来自不受信任来源的原始 HTML 变得更加困难 - 在旧方法中,您只声明对模板的信任,错误的输入可能会以您没有想到的方式进入您的模型。

  2. 如果内容来自您的域或您控制的域,那么您就是安全的 - 至少尽可能安全。如果有人能够以某种方式劫持来自您自己的域的响应的有效负载,那么您的安全性已经完全被搞砸了。但请注意,您绝对应该对来自不属于您的域的内容调用 $sce.trustAsHtml。

  3. 除了可维护性问题之外,我认为您的做法没有任何问题。在 JSON 文件中包含大量 HTML 可能并不理想,但只要标记具有合理的语义并且不太密集,我认为就可以了。如果标记变得更加复杂,我会考虑根据需要将其拆分为单独的角度模板文件或指令,而不是尝试管理一堆包装在 JSON 字符串中的标记。

  • 看起来 $sanitize 的作用与您所问的类似。如果将其作为依赖项包含在内,它会自动清理与 ng-bind-html 绑定的任何内容,并且“所有安全令牌(来自白名单)都会序列化回正确转义的 html 字符串。” 不过,我在文档中找不到确切的白名单上有哪些令牌。http://docs.angularjs.org/api/ngSanitize.$sanitize。请注意,您必须包含一个额外的 angular-sanitize.js 才能使用此模块。 (2认同)