AngularJS mengubah URL menjadi "tidak aman:" di halaman ekstensi


186

Saya mencoba menggunakan Angular dengan daftar aplikasi, dan masing-masing adalah tautan untuk melihat aplikasi lebih detail ( apps/app.id):

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

Setiap kali saya mengklik salah satu tautan ini, Chrome menampilkan URL sebagai

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

Dari mana datangnya unsafe:?


1
Perlu diingat bahwa Anda harus menggunakan ng-hrefdalam kasus ini daripada hanya href: docs.angularjs.org/api/ng/directive/ngHref
hartz89

Saya hanya menggunakan metode pengontrolfunction gotoURL(url) { $window.location.href = url; }
Todd Hale

Jawaban:


362

Anda perlu menambahkan protokol URL secara eksplisit ke daftar putih Angular menggunakan ekspresi reguler. Hanya http, https, ftpdan mailtodiaktifkan secara default. Angular akan mengawali awalan URL yang tidak masuk daftar putih unsafe:ketika menggunakan protokol seperti chrome-extension:.

Tempat yang baik untuk membuat daftar putih chrome-extension:protokol adalah di blok konfigurasi modul Anda:

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

Prosedur yang sama juga berlaku ketika Anda perlu menggunakan protokol seperti file:dan tel:.

Silakan lihat dokumentasi API $ compileProvider AngularJS untuk info lebih lanjut.


11
Dalam Angular 1.2 nama metode menjadi$compileProvider.aHrefSanitizationWhitelist
Mart

6
ImgSrcSanitizationWhitelist Angular 1.2-rc2 default adalah /^\s*(https?|ftp|file):|data:image\//, untuk mengakses sistem file lokal untuk aplikasi yang dikemas dengan chrome |filesystem:chrome-extension:harus ditambahkan ke akhir regex.
Henning

29
Perhatikan bahwa dalam Angular 1.2, sebenarnya ada dua metode - Satu untuk tautan (aHrefSanitizationWhitelist) dan satu untuk gambar (imgSrcSanitizationWhitelist). Ini membuat saya terjebak untuk sementara waktu.
mdierker

1
Untuk Aplikasi yang Dipaket Chrome, Anda harus menambahkannya |blob:chrome-extension:sampai akhir.
adam8810

1
Perhatikan protokol file berbeda dari protokol gumpalan: $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|file|blob|ftp|mailto|chrome-extension):/);
Arnaud Leyder

56

Dalam hal siapa pun memiliki masalah dengan gambar ini, juga:

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

Saya mencoba menggunakan ekspresi reguler untuk daftar putih tangkapan layar gambar yang saya ambil dengan html2canvas, sekarang tidak ada kesalahan yang mengatakan tidak aman: data; tetapi gambar tidak ditangkap. Adakah ungkapan reguler apa yang akan saya gunakan? Saya mengambil gambar / png sebagai url base64. Sekarang html terlihat seperti: <img ng-src = "data :," class = "img-responsif" src = "data:,"> bukannya url base64 yang sebenarnya
hakuna

6

Jika Anda hanya membutuhkan surat, telp dan sms gunakan ini:

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

2

Google Chrome memerlukan ekstensi untuk bekerja sama dengan Content Security Policy (CSP).

Anda perlu mengubah ekstensi Anda untuk memenuhi persyaratan CSP.

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

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

Juga, angularJS memiliki ngCsparahan yang perlu Anda gunakan.

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


Saya sudah memiliki arahan ngCsp untuk halaman itu '<html ng-app = "myApp" ng-csp>'. Ini adalah CSP dari manifes saya: "content_security_policy": "script-src 'self' https://ssl.google-analytics.com; object-src 'self'", Apakah saya perlu mengubah csp di manifes?
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

Untuk Angular 2+Anda dapat menggunakan DomSanitizer's bypassSecurityTrustResourceUrlmetode.

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

class ExampleComponent {
    sanitizedURL : SafeResourceUrl;

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

Hai, Bisakah Anda memberikan contoh yang lebih terperinci untuk hal yang sama.
Jayesh Choudhary

Hai @JayeshChoudhary, Bisakah Anda memberi tahu saya apa yang Anda cari secara spesifik dan saya mungkin bisa membantu Anda dengan lebih baik.
Raman
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.