【发布时间】:2015-01-12 09:16:05
【问题描述】:
如果我完全禁用 $sce 服务会发生什么不良情况?
angular.module('app').config(function ($sceProvider) {
$sceProvider.enabled(false);
});
【问题讨论】:
标签: angularjs security escaping template-engine side-effects
如果我完全禁用 $sce 服务会发生什么不良情况?
angular.module('app').config(function ($sceProvider) {
$sceProvider.enabled(false);
});
【问题讨论】:
标签: angularjs security escaping template-engine side-effects
我可以完全禁用 SCE 吗?
是的,你可以。但是,强烈建议不要这样做。 SCE 以很少的编码开销为您提供了许多安全优势。获取禁用 SCE 的应用程序并自行保护它或在稍后阶段启用 SCE 将更加困难。如果您有大量在引入 SCE 之前编写的现有代码并且一次迁移它们一个模块,那么禁用 SCE 可能是有意义的。
(来自documentation)
【讨论】:
只有在 100% 确定所有应用程序绑定(HTML、URL...)都是安全的情况下,才应禁用 SCE。例如,如果应用程序总是在渲染之前清理服务器或客户端上的用户输入,则可能不需要 SCE 强制执行的额外仪式。
但是,您很少能 100% 肯定所有值都是安全的,尤其是当应用程序变得很大并且由许多开发人员编写代码时。启用 SCE 会强制应用程序只能使用使用 $sce.trustAsXXX 方法之一明确标记为受信任的值。
例如,如果你使用ngBindHtml 来渲染一些HTML,除非分配给ngBindHtml 的范围变量被$sce.trustAsHtml 包裹,否则AngularJS 会抛出错误。当您设置路由或指令的templateUrl 时,会发生类似的强制执行。这通过快速失败使应用程序更加安全,让您有机会审核发生错误的每个地方并决定是信任还是修复它。
最后一点,如果你包含ngSanitize 或实现$sanitize 服务,那么你不需要禁用SCE 来使用不受信任的HTML 值,因为AngularJS 只会使用$sanitize 服务来清理不受信任的输入。同样,如果模板 URL 与应用程序共享源,则无需显式包装它。
【讨论】: