확장 페이지에서 AngularJS가 URL을 "안전하지 않은"으로 변경합니다.


186

앱 목록과 함께 Angular를 사용하려고하는데 각 앱은 앱을보다 자세히 볼 수있는 링크입니다 ( apps/app.id).

<a id="{{app.id}}" href="apps/{{app.id}}" >{{app.name}}</a>

이 링크 중 하나를 클릭 할 때마다 Chrome은 URL을

unsafe:chrome-extension://kpbipnfncdpgejhmdneaagc.../apps/app.id

어디에서 unsafe:왔습니까?


1
당신이 사용하는 것을 명심 ng-href단지보다는이 경우 href: docs.angularjs.org/api/ng/directive/ngHref을
hartz89

나는 단지 컨트롤러 방식을 사용합니다function gotoURL(url) { $window.location.href = url; }
Todd Hale

답변:


362

정규식을 사용하여 URL 프로토콜을 Angular의 화이트리스트에 명시 적으로 추가해야합니다. 만 http, https, ftp그리고 mailto기본적으로 사용하도록 설정되어 있습니다. Angular는와 unsafe:같은 프로토콜 을 사용할 때 허용되지 않는 URL을 앞에 붙 chrome-extension:입니다.

chrome-extension:프로토콜 을 허용하기에 좋은 장소 는 모듈의 구성 블록에 있습니다.

var app = angular.module( 'myApp', [] )
.config( [
    '$compileProvider',
    function( $compileProvider )
    {   
        $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|chrome-extension):/);
        // Angular before v1.2 uses $compileProvider.urlSanitizationWhitelist(...)
    }
]);

당신과 같은 프로토콜을 사용 할 때 동일한 절차에도 적용 file:하고 tel:.

자세한 내용은 AngularJS $ compileProvider API 설명서 를 참조하십시오.


11
Angular 1.2에서 메소드 이름은 다음과 같이되었습니다$compileProvider.aHrefSanitizationWhitelist
Mart

6
기본 imgSrcSanitizationWhitelist Angular 1.2-rc2는 /^\s*(https?|ftp|file):|data:image\//입니다. 크롬 패키지 앱의 로컬 파일 시스템에 액세스 |filesystem:chrome-extension:하려면 정규식 끝에 추가해야합니다.
Henning

29
Angular 1.2에는 실제로 링크 (aHrefSanitizationWhitelist)와 이미지 (imgSrcSanitizationWhitelist)에 대한 두 가지 방법이 있습니다. 이것은 잠시 동안 붙어 있었다.
mdierker

1
Chrome 패키지 앱의 |blob:chrome-extension:경우 끝에 추가 해야합니다.
adam8810

1
파일 프로토콜은 Blob 프로토콜과 다릅니다. $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|file|blob|ftp|mailto|chrome-extension):/);
Arnaud Leyder

56

누구든지 이미지 에이 문제가있는 경우 :

app.config(['$compileProvider', function ($compileProvider) {
    $compileProvider.imgSrcSanitizationWhitelist(/^\s*(https?|local|data|chrome-extension):/);
}]);

html2canvas로 캡처하는 이미지 스크린 샷을 흰색으로 나열하기 위해 정규 표현식을 사용해 보았습니다. 이제 안전하지 않은 오류는 없습니다. 이미지가 캡처되지 않습니다. 어떤 정규 표현식을 사용해야하는지 아십니까? base64 url로 이미지 / png를 캡처하고 있습니다. 이제 html은 다음과 같습니다. 실제 base64 URL 대신 <img ng-src = "data :,"class = "img-responsive"src = "data :,">
hakuna

6

우편, 전화 및 SMS가 필요한 경우 다음을 사용하십시오.

app.config(['$compileProvider', function ($compileProvider) {
    $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|file|sms|tel):/);
}]);

2

Chrome은와 (과) 협력하기 위해 확장 프로그램이 필요합니다 Content Security Policy (CSP).

의 요구 사항을 충족 시키려면 확장을 수정해야합니다 CSP.

https://developer.chrome.com/extensions/contentSecurityPolicy.html

https://developer.mozilla.org/en-US/docs/Security/CSP

또한 angularJS에는 ngCsp사용해야 할 지시문이 있습니다.

http://docs.angularjs.org/api/ng.directive:ngCsp


해당 페이지 '<html ng-app = "myApp"ng-csp>'에 대한 ngCsp 지시문이 이미 있습니다. 이것이 내 매니페스트의 CSP입니다. 매니페스트 "content_security_policy": "script-src 'self' https://ssl.google-analytics.com; object-src 'self'", 에서 csp를 변경해야합니까?
ebi

2
<a href="{{applicant.resume}}" download> download resume</a>


var app = angular.module("myApp", []);

    app.config(['$compileProvider', function($compileProvider) {
         $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|local|data|chrome-extension):/);
        $compileProvider.imgSrcSanitizationWhitelist(/^\s*(https?|local|data|chrome-extension):/);

        }]);

2

들어 Angular 2+당신이 사용할 수 DomSanitizerbypassSecurityTrustResourceUrl방법을.

import {DomSanitizer} from '@angular/platform-browser';

class ExampleComponent {
    sanitizedURL : SafeResourceUrl;

    constructor(
        private sanitizer: DomSanitizer){
        this.sanitizedURL = this.sanitizer.bypassSecurityTrustResourceUrl(); 
    }
}

안녕하십니까,보다 정교한 예제를 제공 할 수 있습니까?
Jayesh Choudhary 2016 년

안녕하세요 @JayeshChoudhary, 구체적으로 무엇을 찾고 있는지 알려 주시면 더 잘 도와 드리겠습니다.
라만
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.