AngularJS 使用$sce控製程式碼安全檢查_AngularJS
由於瀏覽器都有同源載入策略,無法載入不同網域下的檔案、也不能使用不合要求的協定例如file進行存取。
在angularJs中為了避免安全漏洞,一些ng-src或ng-include都會進行安全校驗,因此常常會遇到 一個iframe中的ng-src無法使用。
什麼是SCE
SCE,即strict contextual escaping,我的理解是 嚴格的上下文隔離 ...翻譯的可能不准確,但是通過字面理解,應該是angularjs嚴格的控制上下文訪問。
由於angular預設是開啟SCE的,因此也就是說預設會決絕一些不安全的行為,例如你使用了某個第三方的腳本或程式庫、載入了一段html等等。
這樣做確實是安全了,避免一些跨站XSS,但是有時候我們自己想要載入特定的文件,這時候怎麼辦呢?
此時可以透過$sce服務把一些地址變成安全的、授權的連結...簡單地說, 就像告訴門衛,這個陌生人其實是我的好朋友,很值得信賴,不必攔截它!
常用的方法有:
$sce.trustAs(type,name);
$sce.trustAsHtml(value);
$sce.trustAsUrl(value);
$sce.trustAsResourceUrl(value);
$sce.trustAsJs(value);
其中後面的幾個都是基於第一個api使用的,例如trsutAsUrl其實調用的是trsutAs($sce.URL,"xxxx");
其中 type 可選的值為:
$sce.HTML
$sce.CSS
$sce.URL //a標籤中的href , img標籤中的src
$sce.RESOURCE_URL //ng-include,src或ngSrc,如iframe或Object
$sce.JS
來自官網的例子:ng-bind-html
<!DOCTYPE html> <html> <head> <title></title> <script src="http://apps.bdimg.com/libs/angular.js/1.2.16/angular.min.js"></script> </head> <body ng-app="mySceApp"> <div ng-controller="AppController"> <i ng-bind-html="explicitlyTrustedHtml" id="explicitlyTrustedHtml"></i> </div> <script type="text/javascript"> angular.module('mySceApp',[]) .controller('AppController', ['$scope', '$sce', function($scope, $sce) { $scope.explicitlyTrustedHtml = $sce.trustAsHtml( '<span onmouseover="this.textContent="Explicitly trusted HTML bypasses ' + 'sanitization."">Hover over this text.</span>'); }]); </script> </body> </html>
實際工作中的例子:ng-src連結
<!DOCTYPE html> <html> <head> <title></title> <script src="http://apps.bdimg.com/libs/angular.js/1.2.16/angular.min.js"></script> </head> <body ng-app="mySceApp"> <div ng-controller="AppController"> <iframe width="100%" height="100%" seamless frameborder="0" ng-src="{{trustSrc}}"></iframe> </div> <script type="text/javascript"> angular.module('mySceApp',[]) .controller('AppController', ['$scope','$sce',function($scope,$sce) { $scope.trustSrc = $sce.trustAs($sce.RESOURCE_URL,"http://fanyi.youdao.com/"); // $scope.trustSrc = $sce.trustAsResourceUrl("http://fanyi.youdao.com/");//等同于这个方法 }]); </script> </body> </html>
還有一點時間,接著跟大家介紹angular中的ng-bind-html指令和$sce服務
angular js的強大之處之一就是他的資料雙向綁定這一牛B功能,我們會常常用到的兩個東西就是ng-bind和針對form的ng-model。但在我們的專案當中會遇到這樣的情況,後台回傳的資料中帶有各種各樣的html標籤。如:
$scope.currentWork.description = “hello,
今天我們要去哪裡?”
我們用ng-bind-html這樣的指令來綁定,結果卻不是我們想要的。是這樣的
hello,
今天我們要去哪裡?
怎麼辦呢?
對於angular 1.2一下的版本我們必須使用$sce這個服務來解決我們的問題。所謂sce即「Strict Contextual Escaping」的縮寫。翻譯成中文就是「嚴格的上下文模式」也可以理解為安全綁定吧。來看看怎麼用吧。
controller code:
$http.get('/api/work/get?workId=' + $routeParams.workId).success(function (work) {$scope.currentWork = work;});
HTML code:
<p> {{currentWork.description}}</p>
我們回傳的內容包含一系列的html標記。表現出來的結果就如我們文章開頭所說的。這時候我們必須告訴它安全綁定。它可以透過使用$ sce.trustAsHtml()。該方法將值轉換為特權所接受並能安全地使用“ng-bind-html”。所以,我們必須在我們的控制器中引入$sce服務
controller('transferWorkStep2', ['$scope','$http','$routeParams','$sce', function ($scope,$http, $routeParams, $sce) { $http.get('/api/work/get?workId=' + $routeParams.workId) .success(function (work) { $scope.currentWork = work; $scope.currentWork.description = $sce.trustAsHtml($rootScope.currentWork.description); });
html code:
<p ng-bind-html="currentWork.description"></p>
這樣結果就完美的呈現在頁面上了:
hello
今天我們要去哪裡?
咱們還可以這樣用,把它封裝成一個過濾器就可以在模板上隨時調用了
app.filter('to_trusted', ['$sce', function ($sce) { return function (text) { return $sce.trustAsHtml(text); }; }]);
html code:
全選複製放進筆記
<p ng-bind-html="currentWork.description | to_trusted"></p>

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務
