2014-11-14 72 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