2014-11-14 30 views
5

如果完全禁用$ sce服务会发生什么问题?

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

回答

3

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

但是,对于所有值都是安全的,特别是当应用程序变得很大并且由许多开发人员编码时,您可以100%肯定地发生这种情况非常罕见。启用S​​CE强制应用程序只能使用$sce.trustAsXXX方法之一明确标记为可信的值。

例如,如果您使用ngBindHtml来呈现某些HTML,则除非将分配给ngBindHtml的范围变量与$sce.trustAsHtml包装在一起,否则AngularJS将引发错误。当您设置路线或指令的templateUrl时,会发生类似的实施。这使得应用程序更快速地更安全,让您有机会审核发生错误的每个地方,并决定是否信任或修复它。

最后要注意,如果包括ngSanitize或实施$sanitize服务,那么你就需要禁用SCE为AngularJS只会消毒使用$sanitize服务不可信投入使用不可信HTML值。同样,如果模板URL将源代码作为应用程序共享,则不需要显式包装它。

+1

太好了!我期待的这种答案,谢谢! – artuska 2014-11-15 12:04:10

+0

您能否澄清一下您在最后一段中的含义? – naXa 2016-01-18 15:01:26

+0

“稀有”可能是主观的,它涉及到正在进行的项目的种类。例如,我有一个包含0个用户输入的项目。 – 2018-01-31 06:33:16

0

我可以完全禁用SCE吗?

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

(从documentation