使用AngularJS中的SCE來防止XSS攻擊的方法
這篇文章展示了有關(guān)XSS(跨站腳本)的不同方案以及怎樣使用AngularJS中SCE($sceProvider),sanitize service這些特性來正確處理XSS。如果我遺漏了什么重要的地方請直接評論/建議。同時,錯別字請見諒。
以下幾點內(nèi)容將是我接下來要講述的重點:
- 全部轉(zhuǎn)碼HTML
- 安全插入HTML的同時忽略類似“script"這樣的標簽。如果不加以注意,這將一樣存在風險同時也會丑化頁面,尤其是在有”img“標簽的時候。
- 依賴并插入純HTML;這也有風險的同時會讓網(wǎng)頁很難看。
使用ng-bind指令轉(zhuǎn)碼HTML
你可以用ng-bind指令來轉(zhuǎn)碼整個網(wǎng)頁。它將會轉(zhuǎn)碼所有HTML標簽但是仍然顯示本來的樣子。下列代碼顯示了ng-bind的用法。
<div> <form> <h1>AngularJS XSS Demo Test</h1> <hr/> <div class="col-md-12"> <input type="text" ng-model="name" class="form-control col-md-12" ng-change="processHtmlCode()" placeholder="Enter Some HTML Text..."/> </div> </form> </div> <hr/> <div style="padding:20px"> <span><strong>ng-bind directive: Note that HTML text is entered as it is.</strong></span><br/> <span ng-bind="helloMessage">{{helloMessage}}</span> </div>
下面的圖證明了以上言論。注意在輸入欄中的HTML代碼。它和在HTML頁面中完全一樣。
使用安全的方式插入HTML,也可以使用 ng-bind-html 指令忽略掉諸如“script”這樣的元素
這是解決XSS攻擊的關(guān)鍵. 也就是說,你仍然應(yīng)該關(guān)注諸如“img"這樣的元素 ( 作為一部分包含進了白名單中; 還有空元素) 因為它恩能夠在你的web頁面上展示任何圖片 (包括非法的那些), 因此,它也可能會給你的web頁面帶來不利影響. 使用 ng-bind-html 指令皆可以AngularJS諸如“script”這樣的JavaScript標記直接被忽略掉. ng-bind-html 指令會計算表達式,并且用一種安全的方式將結(jié)果HTML插入元素中. 對于用戶會輸入包含了HTML內(nèi)容(比如在評論中)的情況,放到 ng-bind-html指令中可以確保文本被編碼為白名單中的安全HTML字符. 安全字符的白名單被作為 $sanitize 的一部分編碼,下面會講到. 下面這些都被包含進了安全列表中 (直接從源代碼中獲得):
空元素:
塊元素:
內(nèi)聯(lián)元素:
結(jié)尾標記元素:
下面的這兩個元素 因為其內(nèi)容不收信任,需要被規(guī)避掉. 在這種情況下,如果你想要展示它們,就要使用 $sce 服務(wù),調(diào)用Angular 的 trustAsHtml 方法來執(zhí)行下面提到的元素.
- script
- style
如下呈現(xiàn)的代碼展示了 ng-bind-html 指令的使用.
<div> <form> <h1>AngularJS XSS Demo Test</h1> <hr/> <div class="col-md-12"> <input type="text" ng-model="name" class="form-control col-md-12" ng-change="processHtmlCode()" placeholder="Enter Some HTML Text..."/> </div> </form> </div> <hr/> <div style="padding:20px"> <span>ng-bind-html directive: Note that image is displayed appropriately as a result of text entered in the text field.</span> <span ng-bind-html="helloMessage"></span> </div>
下面這張圖片展示了當在文本域中輸入HTML代碼,Angular用一種安全的方式插入到DOM時,是什么樣子的. 注意 “img” 元素是上述列表中空元素的一份子. 因為代碼被輸入到了文本域中,作為”img"出現(xiàn)的圖片被放到了受信任的列表(白名單)中。
信任并插入整段HTML
警告: 這很危險,并且可能很容易就最終造成你web站點的污染. 只有當你知道并且充分確認時,你才應(yīng)該使用 trustAsHtml. 如此,你就有充足的信心認為這段文本是可以被信任的, 你應(yīng)該使用$sce 服務(wù)并且調(diào)用 trustAsHtml 方法來講整段HTML插入DOM中。在$sce服務(wù)被用來調(diào)用 trustAsHtml 方法來信任一段HTML代碼時,請留意HTML和其中的JavaScript代碼塊. 在這種情況下,一段諸如 “<style>.hello{color:red}</style>” 這樣的代碼被插入了,它最后可能會也給現(xiàn)有的HTML元素加上樣式。這可能不是很好。人們也可能采用那種方式用非法的圖片替換背景圖片.
<script type="text/javascript"> angular.module('HelloApp', ["ngSanitize"]) .controller('HelloCtrl', ['$scope', '$sce', function($scope, $sce){ $scope.name=""; $scope.processHtmlCode = function() { $scope.helloMessage = "<h1>" + $scope.name + "</h1>"; $scope.trustedMessage = $sce.trustAsHtml( $scope.name ); } }]) </script> <!-- Pay attention to class hello which is coded in UI and as a result, element is painted in red--> <div style="padding:20px"> <span class="hello"><strong>ng-bind directive: Note that HTML text is entered as it is.</strong></span><br/> <span class="hello" ng-bind="helloMessage">{{helloMessage}}</span> </div> <hr/> <div style="padding:20px"> <span>Note that script tag is executed as well.</span> <span ng-bind-html="trustedMessage"></span> </div>
下面的圖片展示了當在文本域中輸入將要被插入DOM中的HTML樣式代碼時,會是什么樣子. 這里的結(jié)果就是, 其它的HTML元素也帶上了紅色, 如下所示. 在某些場景中,黑客可能會插入一段帶有背景樣式越蘇,這可能會顯示出原本不要被顯示的背景,給最終用戶帶來糟糕的體驗.
<html> <head> <title>Hello AngularJS</title> <link rel="stylesheet" type="text/css" > <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/angularjs/1.3.3/angular.min.js"></script> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/angularjs/1.3.3/angular-sanitize.min.js"></script> </head> <body class="container" ng-app="HelloApp" ng-controller="HelloCtrl"> <div> <form> <h1>AngularJS XSS Demo Test</h1> <hr/> <div class="col-md-12"> <input type="text" ng-model="name" class="form-control col-md-12" ng-change="processHtmlCode()" placeholder="Enter Some HTML Text..."/> </div> </form> <hr/> </div> <hr/> <div style="padding:20px"> <span class="hello"><strong>ng-bind directive: Note that HTML text is entered as it is.</strong></span><br/> <span class="hello" ng-bind="helloMessage">{{helloMessage}}</span> </div> <hr/> <div style="padding:20px"> <span>Note that script tag is executed as well.</span> <span ng-bind-html="trustedMessage"></span> </div> <hr/> <div style="padding:20px"> <span>ng-bind-html directive: Note that image is displayed appropriately as a result of text entered in the text field.</span> <span ng-bind-html="helloMessage"></span> </div> <hr/> <script type="text/javascript"> angular.module('HelloApp', ["ngSanitize"]) .controller('HelloCtrl', ['$scope', '$sce', function($scope, $sce){ $scope.name=""; $scope.processHtmlCode = function() { $scope.helloMessage = "<h1>" + $scope.name + "</h1>"; $scope.trustedMessage = $sce.trustAsHtml( $scope.name ); } }]) </script> </body> </html>
相關(guān)文章
詳解Angular CLI + Electron 開發(fā)環(huán)境搭建
本篇文章主要介紹了Angular CLI + Electron 開發(fā)環(huán)境搭建,具有一定的參考價值,有興趣的可以了解一下2017-07-07利用Angular2的Observables實現(xiàn)交互控制的方法
這篇文章主要介紹了利用Angular2的Observables實現(xiàn)交互控制的方法,我們主要針對一些在跟服務(wù)器端交互的時候遇到的問題,來看看Observable給我們帶來的特性。感興趣的可以了解一下2018-12-12Angular?服務(wù)器端渲染應(yīng)用常見的內(nèi)存泄漏問題小結(jié)
這篇文章主要介紹了Angular?服務(wù)器端渲染應(yīng)用一個常見的內(nèi)存泄漏問題,主要包括屏幕閃爍問題,出現(xiàn)閃爍的原因,在于 Angular 不知道如何重用它在服務(wù)器上成功渲染的內(nèi)容,本文給大家介紹的非常詳細,需要的朋友一起學(xué)習下吧2022-06-06AngularJs Understanding Angular Templates
本文主要介紹AngularJs Understanding Angular Templates的資料,這里整理了詳細的資料及簡單示例代碼,有興趣的小伙伴的參考下2016-09-09Angular的Bootstrap(引導(dǎo))和Compiler(編譯)機制
這篇文章主要介紹了Angular的Bootstrap(引導(dǎo))和Compiler(編譯)機制的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-06-06AngularJs 利用百度地圖API 定位當前位置 獲取地址信息
本文主要介紹了AngularJs 利用百度地圖API 定位當前位置 獲取地址信息的方法步驟。具有一定的參考價值,下面跟著小編一起來看下吧2017-01-01