禁用$ sce服务缺陷

时间:2014-11-14 21:29:34

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

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

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

2 个答案:

答案 0 :(得分:4)

如果您100%确定所有应用程序绑定(HTML,URL ...)都是安全的,则应该只禁用SCE。例如,如果应用程序在呈现之前始终在服务器或客户端上清理用户输入,则可能不需要SCE强制执行的附加仪式。

但是,你很可能100%肯定所有值都是安全的,特别是当应用程序变大并且由许多开发人员编码时。启用S​​CE会强制应用程序只能使用$sce.trustAsXXX方法之一显式标记为受信任的值。

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

最后要注意的是,如果您包含ngSanitize或实施$sanitize服务,那么您无需禁用SCE来使用不受信任的HTML值,因为AngularJS将使用{来清理不受信任的输入{1}}服务。同样,如果模板URL将源作为应用程序共享,则无需显式包装它。

答案 1 :(得分:1)

  

我可以完全禁用SCE吗?

     

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

(来自documentation