AngularJ가 외부 리소스를로드하지 않음


195

Angular와 Phonegap을 사용하여 원격 서버에 있지만 문제가 발생한 비디오를로드하려고합니다. 내 JSON에서 URL은 일반 HTTP URL로 입력됩니다.

"src" : "http://www.somesite.com/myvideo.mp4"

내 비디오 템플릿

 <video controls poster="img/poster.png">
       <source ng-src="{{object.src}}" type="video/mp4"/>
 </video>

다른 모든 데이터가로드되지만 콘솔을 볼 때이 오류가 발생합니다.

Error: [$interpolate:interr] Can't interpolate: {{object.src}}
Error: [$sce:insecurl] Blocked loading resource from url not allowed by $sceDelegate policy.  URL

$compileProvider구성 설정 을 추가하려고 시도했지만 문제가 해결되지 않았습니다.

$compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|file|tel):/);

교차 도메인 문제에 대한이 게시물을 보았지만 이 문제 를 해결하는 방법 또는 어떤 방향으로 들어가야할지 모르겠습니다. 어떤 아이디어가 있습니까? 어떤 도움을 주셔서 감사합니다


1
corodva의 config.xml파일을 올릴 수 있습니까?
Andrew Shustariov

1
현재 브라우저에서 테스트 중이므로 phonegap 디버깅을 시작하지 않았습니다.
mhartington

답변:


267

이것은 나를 위해 일한 유일한 솔루션입니다.

var app = angular.module('plunker', ['ngSanitize']);

app.controller('MainCtrl', function($scope, $sce) {
  $scope.trustSrc = function(src) {
    return $sce.trustAsResourceUrl(src);
  }

  $scope.movie = {src:"http://www.youtube.com/embed/Lx7ycjC8qjE", title:"Egghead.io AngularJS Binding"};
});

그런 다음 iframe에서 :

<iframe class="youtube-player" type="text/html" width="640" height="385"
        ng-src="{{trustSrc(movie.src)}}" allowfullscreen frameborder="0">
</iframe>

http://plnkr.co/edit/tYq22VjwB10WmytQO9Pb?p=preview


iFrame없이 가능합니까? 세션 정보가 소비자가 비디오를 볼 수 있는지 여부를 결정하는 비디오를 포함해야합니다. 세션 정보는 iFrame을 통해 전달되지 않습니다.
Blake

iframe을 사용할 수 있다면 좋을 것입니다
Ringo

270

또 다른 간단한 해결책은 필터를 만드는 것입니다.

app.filter('trusted', ['$sce', function ($sce) {
    return function(url) {
        return $sce.trustAsResourceUrl(url);
    };
}]);

그런 다음 필터를 다음에 지정하십시오 ng-src.

<video controls poster="img/poster.png">
       <source ng-src="{{object.src | trusted}}" type="video/mp4"/>
</video>

22
확실히 가장 우아하고 화난 해결책.
Sc0ttyD

1
나를 위해 일했고 실제로 iframe을 사용하는 것보다 좋습니다.
Thomas Amar

1
가장 좋은 대답, 더 많은 각도 정신 및 다른 솔루션이 어떤 이유로 인해되지 않은 곳에서 작동했습니다. 고마워요!
floribon

76

$ sceDelegateProvider로 리소스를 허용

이는 Angular 1.2에 적용된 새로운 보안 정책으로 인해 발생합니다. 해커가 전화를 걸지 못하도록하여 (예 : 페이로드가 포함 된 외부 URL에 요청) XSS를 더욱 어렵게 만듭니다.

올바르게 해결하려면 다음과 같이 허용하려는 도메인을 허용 목록에 추가해야합니다.

angular.module('myApp',['ngSanitize']).config(function($sceDelegateProvider) {
  $sceDelegateProvider.resourceUrlWhitelist([
    // Allow same origin resource loads.
    'self',
    // Allow loading from our assets domain.  Notice the difference between * and **.
    'http://srv*.assets.example.com/**'
  ]);

  // The blacklist overrides the whitelist so the open redirect here is blocked.
  $sceDelegateProvider.resourceUrlBlacklist([
    'http://myapp.example.com/clickThru**'
  ]);
});

이 예제는 여기에서 읽을 수있는 설명서에서 발췌 한 것입니다.

https://docs.angularjs.org/api/ng/provider/$sceDelegateProvider

이 작업을 수행하려면 앱에 ngSanitize를 포함시켜야합니다.

기능 비활성화

이 유용한 기능을 끄고 데이터가 안전하다고 확신하는 경우 다음과 같이 **를 허용하면됩니다.

angular.module('app').config(function($sceDelegateProvider) {
  $sceDelegateProvider.resourceUrlWhitelist(['**']);
});

2
참고 : resourceUrlWhitelist어떻게 든 작동하지 않으면 도메인 이름 뒤에 이중 슬래시가 없는지 확인하십시오 (변수에서 물건을 연결할 때 쉽게 발생하며 둘 다 슬래시가 있음)
jakub.g

2
이것은이 문제를 해결할 수있는보다 깨끗하고 글로벌하며 안전한 방법입니다.
DJ.

"전화 걸기"는 문제를 이해하려는 사람에게 사용하기에 좋은 용어가 아닙니다.
링고

1
감사합니다 @Ringo-명확히하기 위해 의견을 추가했습니다.
superluminary

21

여기에서도 같은 문제가있었습니다. 유튜브 링크에 바인딩해야했습니다. 글로벌 솔루션 으로 저에게 도움 이 된 것은 구성에 다음을 추가하는 것이 었습니다.

.config(['$routeProvider', '$sceDelegateProvider',
        function ($routeProvider, $sceDelegateProvider) {

    $sceDelegateProvider.resourceUrlWhitelist(['self', new RegExp('^(http[s]?):\/\/(w{3}.)?youtube\.com/.+$')]);

}]);

거기에 'self' 를 추가하는 것이 중요합니다. 그렇지 않으면 URL에 바인딩하지 못합니다. 로부터 각 문서

'self'-특수 문자열 'self'는 동일한 프로토콜을 사용하여 애플리케이션 문서와 동일한 도메인의 모든 URL과 일치시키는 데 사용될 수 있습니다.

이를 통해 이제 모든 유튜브 링크에 직접 바인딩 할 수 있습니다.

정규식을 필요에 맞게 사용자 정의해야합니다. 그것이 도움이되기를 바랍니다!


4

이 문제를 해결하기위한 가장 쉽고 쉬운 해결책은 컨트롤러에서이 기능의 데이터를 전달하는 것입니다.

$scope.trustSrcurl = function(data) 
{
    return $sce.trustAsResourceUrl(data);
}

HTML 페이지에서

<iframe class="youtube-player" type="text/html" width="640" height="385" ng-src="{{trustSrcurl(video.src)}}" allowfullscreen frameborder="0"></iframe>

2

Videogular를 사용하여 동일한 문제가 발생했습니다. ng-src를 사용할 때 다음을 얻었습니다.

Error: [$interpolate:interr] Can't interpolate: {{url}}
Error: [$sce:insecurl] Blocked loading resource from url not allowed by $sceDelegate policy

기본 지시문을 작성하여 문제를 해결했습니다.

angular.module('app').directive('dynamicUrl', function () {
return {
  restrict: 'A',
  link: function postLink(scope, element, attrs) {
    element.attr('src', scope.content.fullUrl);
  }
};
});

HTML :

 <div videogular vg-width="200" vg-height="300" vg-theme="config.theme">
    <video class='videoPlayer' controls preload='none'>
          <source dynamic-url src='' type='{{ content.mimeType }}'>
    </video>
 </div>

2

누구든지 TypeScript 솔루션을 찾고 있다면 :

.ts 파일 (해당되는 경우 변수 변경) :

module App.Filters {

    export class trustedResource {

        static $inject:string[] = ['$sce'];

        static filter($sce:ng.ISCEService) {
            return (value) => {
                return $sce.trustAsResourceUrl(value)
            };
        }
    }
}
filters.filter('trustedResource', App.Filters.trusted.filter);

HTML :

<video controls ng-if="HeaderVideoUrl != null">
  <source ng-src="{{HeaderVideoUrl | trustedResource}}" type="video/mp4"/>
</video>

1

오류 메시지에 따라 문제 가 도메인 간 문제가 아니라 보간 (일반적으로 expression {{}}) 과 관련이있는 것 같습니다 . 기본적으로 ng-src="{{object.src}}"짜증납니다.

ng-srcimgIMO를 염두에두고 설계되었습니다 . 에 적합하지 않을 수 있습니다 <source>. http://docs.angularjs.org/api/ng.directive:ngSrc를 참조 하십시오

선언하면 <source src="somesite.com/myvideo.mp4"; type="video/mp4"/>작동합니다. 그렇습니까? (I 제거주의 ng-src에 찬성 src먼저 해결해야되지 않은 경우).

그런 다음 {{object.src}}예상 값을 외부 로 반환하십시오 <video>.

<span>{{object.src}}</span>
<video>...</video>

예상 값을 반환하면 다음 문이 작동해야합니다.

<source src="{{object.src}}"; type="video/mp4"/> //src instead of ng-src

src를 사용하고 URL을 하드 코딩하면 모든 것이 원하는대로 작동합니다. src 속성이 생각조차 전달되지 않지만 {{object.src}}를 사용하자마자. 계속해서 소스 태그를 제거하고 비디오 태그와 함께 src를 삽입했지만 여전히 아무것도 없습니다
mhartington

{{object.src}}가 값을 반환한다고 확신하십니까? 정의되지 않은 상태로 반환 될 수 있습니다.
roland

{{object.src}}이 (가) 값을 리턴 중입니다. <p> </ p>와 <a> </a>를 사용하여 테스트
mhartington

1
아마도이를 이미 발견했으며 꽤 좋아 보입니다. videogular.com/# . 도움을 주셔서 감사합니다
mhartington

2
이것은 ng-src깨지는 것과 아무런 관련 이 없습니다 (깨지지 않았습니다). : 그것은 AngularJS와의 보안 정책과 관련이있다 docs.angularjs.org/api/ng/service/$sce
Pauan

0

테스트 에서이 오류가 발생했으며 지시문 templateUrl은 신뢰할 수 없지만 사양에 대해서만 신뢰할 수 있으므로 템플릿 디렉토리를 추가했습니다.

beforeEach(angular.mock.module('app.templates'));

내 주요 디렉토리는 app입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.