AngularJS thay đổi URL thành không an toàn:


186

Tôi đang cố gắng sử dụng Angular với danh sách các ứng dụng và mỗi ứng dụng là một liên kết để xem ứng dụng chi tiết hơn ( apps/app.id):

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

Mỗi lần tôi nhấp vào một trong những liên kết này, Chrome sẽ hiển thị URL dưới dạng

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

Nơi nào unsafe:đến từ đâu?


1
Hãy nhớ rằng bạn nên sử dụng ng-hreftrong trường hợp này thay vì chỉ href: docs.angularjs.org/api/ng/directive/ngHref
hartz89 19/07/16

Tôi chỉ sử dụng một phương thức điều khiểnfunction gotoURL(url) { $window.location.href = url; }
Todd Hale

Câu trả lời:


362

Bạn cần thêm rõ ràng các giao thức URL vào danh sách trắng của Angular bằng cách sử dụng biểu thức chính quy. Chỉ http, https, ftpmailtođược kích hoạt theo mặc định. Angular sẽ thêm tiền tố vào một URL không có trong danh sách trắng unsafe:khi sử dụng giao thức như chrome-extension:.

Một nơi tốt để đưa danh sách trắng vào chrome-extension:giao thức sẽ nằm trong khối cấu hình của mô-đun của bạn:

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

Quy trình tương tự cũng được áp dụng khi bạn cần sử dụng các giao thức như file:tel:.

Vui lòng xem tài liệu API AngularJS $ compileProvider để biết thêm thông tin.


11
Trong Angular 1.2, tên phương thức đã trở thành$compileProvider.aHrefSanitizationWhitelist
Mart

6
ImgSrcSanitization mặc địnhWhlistist Angular 1.2-RC2 là /^\s*(https?|ftp|file):|data:image\//, để truy cập hệ thống tập tin cục bộ cho một ứng dụng đóng gói chrome |filesystem:chrome-extension:nên được thêm vào cuối regex.
Henning

29
Lưu ý rằng trong Angular 1.2, thực tế có hai phương thức - Một cho các liên kết (aHrefSanitizationWhlistist) và một cho hình ảnh (imgSrcSanitizationWhlistist). Điều này đã khiến tôi bị mắc kẹt trong một thời gian.
mdierker

1
Đối với Ứng dụng đóng gói Chrome, bạn cần thêm |blob:chrome-extension:vào cuối.
adam8810

1
Lưu ý giao thức tệp khác với giao thức blob: $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|file|blob|ftp|mailto|chrome-extension):/);
Arnaud Leyder

56

Trong trường hợp bất cứ ai cũng có vấn đề này với hình ảnh, cũng:

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

Tôi đã thử sử dụng biểu thức chính quy cho danh sách trắng các ảnh chụp màn hình hình ảnh tôi đang chụp bằng html2canvas, bây giờ không có lỗi nào nói không an toàn: dữ liệu; nhưng hình ảnh không được chụp. Bất cứ ý tưởng nào tôi sẽ sử dụng biểu thức chính quy? Tôi đang chụp ảnh / png dưới dạng url base64. Bây giờ html trông giống như: <img ng-src = "data:," class = "img-responsive" src = "data :,"> thay vì url base64 thực tế
hakuna

6

Nếu bạn chỉ cần thư, tel và sms hãy sử dụng điều này:

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

2

Google Chrome yêu cầu các tiện ích mở rộng của nó hợp tác với Content Security Policy (CSP).

Bạn cần sửa đổi phần mở rộng của mình để đáp ứng các yêu cầu của CSP.

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

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

Ngoài ra, angularJS có ngCspchỉ thị mà bạn cần sử dụng.

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


Tôi đã có chỉ thị ngCsp cho trang đó '<html ng-app = "myApp" ng-csp>'. Đây là CSP từ bảng kê khai của tôi: "content_security_policy": "script-src 'self' https://ssl.google-analytics.com; object-src 'self'", Tôi có cần thay đổi csp trong tệp kê khai không?
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

Đối với Angular 2+bạn có thể sử dụng DomSanitizer's bypassSecurityTrustResourceUrlphương pháp.

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

class ExampleComponent {
    sanitizedURL : SafeResourceUrl;

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

Xin chào, bạn có thể cung cấp một ví dụ chi tiết hơn cho cùng.
Jayesh Choudhary

Xin chào @JayeshChoudhary, Bạn có thể vui lòng cho tôi biết những gì bạn đang tìm kiếm cụ thể và tôi có thể giúp bạn tốt hơn.
Raman
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.