【问题标题】:Disable $sce service drawbacks禁用 $sce 服务缺点
【发布时间】:2015-01-12 09:16:05
【问题描述】:

如果我完全禁用 $sce 服务会发生什么不良情况?

angular.module('app').config(function ($sceProvider) {
    $sceProvider.enabled(false);
});

【问题讨论】:

    标签: angularjs security escaping template-engine side-effects


    【解决方案1】:

    我可以完全禁用 SCE 吗?

    是的,你可以。但是,强烈建议不要这样做。 SCE 以很少的编码开销为您提供了许多安全优势。获取禁用 SCE 的应用程序并自行保护它或在稍后阶段启用 SCE 将更加困难。如果您有大量在引入 SCE 之前编写的现有代码并且一次迁移它们一个模块,那么禁用 SCE 可能是有意义的。

    (来自documentation

    【讨论】:

      【解决方案2】:

      只有在 100% 确定所有应用程序绑定(HTML、URL...)都是安全的情况下,才应禁用 SCE。例如,如果应用程序总是在渲染之前清理服务器或客户端上的用户输入,则可能不需要 SCE 强制执行的额外仪式。

      但是,您很少能 100% 肯定所有值都是安全的,尤其是当应用程序变得很大并且由许多开发人员编写代码时。启用 SCE 会强制应用程序只能使用使用 $sce.trustAsXXX 方法之一明确标记为受信任的值。

      例如,如果你使用ngBindHtml 来渲染一些HTML,除非分配给ngBindHtml 的范围变量被$sce.trustAsHtml 包裹,否则AngularJS 会抛出错误。当您设置路由或指令的templateUrl 时,会发生类似的强制执行。这通过快速失败使应用程序更加安全,让您有机会审核发生错误的每个地方并决定是信任还是修复它。

      最后一点,如果你包含ngSanitize 或实现$sanitize 服务,那么你不需要禁用SCE 来使用不受信任的HTML 值,因为AngularJS 只会使用$sanitize 服务来清理不受信任的输入。同样,如果模板 URL 与应用程序共享源,则无需显式包装它。

      【讨论】:

      • 你能澄清一下你在最后一段中的意思吗?
      • “稀有”可能是主观的,它与正在完成的项目类型有关。例如,我有一个包含 0 个用户输入的项目。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-26
      • 2016-11-11
      • 1970-01-01
      相关资源
      最近更新 更多