AngularJS는 $sce를 사용하여 코드 보안 검사를 제어합니다._AngularJS

WBOY
풀어 주다: 2016-05-16 15:21:47
원래의
1052명이 탐색했습니다.

브라우저에는 동일 원본 로딩 정책이 있기 때문에 서로 다른 도메인의 파일을 로드할 수 없으며, 파일과 같은 만족스럽지 못한 프로토콜을 사용하여 액세스할 수도 없습니다.

AngularJ의 보안 허점을 피하기 위해 일부 ng-src 또는 ng-include에 대한 보안 검사가 수행되므로 iframe의 ng-src를 사용할 수 없는 경우가 종종 있습니다.

SCE란

SCE, 즉, strict contextual escaping, 내 이해는 strict contextisolation... 번역이 정확하지 않을 수도 있지만 문자 그대로의 이해를 통해 anglejs가 context 접근을 엄격하게 제어해야 한다는 것입니다.

SCE는 기본적으로 각도에 의해 활성화되므로 타사 스크립트 또는 라이브러리 사용, HTML 일부 로드 등과 같은 일부 안전하지 않은 동작이 기본적으로 금지됩니다.

이것은 실제로 안전하고 크로스 사이트 XSS를 방지하지만 때로는 특정 파일을 직접 로드하고 싶을 때도 있습니다. 이 경우 어떻게 해야 합니까?

이때 $sce 서비스를 이용하면 일부 주소를 안전하고 승인된 링크로 바꿀 수 있습니다... 간단히 말해서, 이 낯선 사람이 실제로는 나의 좋은 친구이고 매우 신뢰할 수 있는 사람이라고 도어맨에게 말하는 것과 같습니다. 그것을 가로챌 필요가 없습니다!

일반적으로 사용되는 방법은 다음과 같습니다.

$sce.trustAs(유형,이름);
$sce.trustAsHtml(값);
$sce.trustAsUrl(값);
$sce.trustAsResourceUrl(값);
$sce.trustAsJs(값);

다음은 첫 번째 API를 기반으로 합니다. 예를 들어 trsutAsUrl은 실제로 trsutAs($sce.URL,"xxxx");

를 호출합니다.

type의 선택적 값은 다음과 같습니다.

$sce.HTML
$sce.CSS
$sce.URL //href는 태그에, src
는 img 태그에 $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>
로그인 후 복사

아직 시간이 있으니 ng-bind-html 지시어와 Angle의 $sce 서비스를 소개해드리겠습니다

Angular js의 강력한 기능 중 하나는 양식에 대해 자주 사용하는 두 가지 기능인 ng-bind와 ng-model입니다. 그러나 우리 프로젝트에서는 백그라운드에서 반환된 데이터에 다양한 html 태그가 포함되어 있는 상황이 발생합니다. 예:

$scope.currentWork.description = “안녕하세요.
오늘 어디로 갈까요?
ng-bind-html과 같은 명령을 사용하여 바인딩하지만 결과는 우리가 원하는 것과 다릅니다. 이렇습니다

안녕하세요

오늘은 어디로 갈까요?

어떻게 해야 할까요?

Angular 1.2 이하 버전의 경우 문제를 해결하려면 $sce 서비스를 사용해야 합니다. 소위 sce는 "Strict Contextual Escaping"의 약어입니다. 중국어로 번역하면 "엄격한 컨텍스트 모드"가 되며 이는 안전한 바인딩으로도 이해될 수 있습니다. 사용 방법을 살펴보겠습니다.

컨트롤러 코드:

$http.get('/api/work/get&#63;workId=' + $routeParams.workId).success(function (work) {$scope.currentWork = work;});
로그인 후 복사

HTML 코드:

<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&#63;workId=' + $routeParams.workId)
.success(function (work) {
  $scope.currentWork = work;
  $scope.currentWork.description = $sce.trustAsHtml($rootScope.currentWork.description);
});
로그인 후 복사

html 코드:

<p ng-bind-html="currentWork.description"></p>
로그인 후 복사

결과는 다음 페이지에 완벽하게 표시됩니다.

안녕하세요

오늘은 어디로 갈까요?

이 방법을 사용하여 필터에 캡슐화하고 언제든지 템플릿에서 호출할 수도 있습니다

app.filter('to_trusted', ['$sce', function ($sce) {
return function (text) {
  return $sce.trustAsHtml(text);
};
}]);
로그인 후 복사

html 코드:

모두 선택하여 노트에 복사하세요

<p ng-bind-html="currentWork.description | to_trusted"></p>
로그인 후 복사
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!