forked from angular/angular.js
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix($compile): allow data: image URIs in img[src]
Ref: 1adf29a BREAKING CHANGE: img[src] URLs are now sanitized via a separate whitelist regex instead of sharing the whitelist regex with a[href]. With this change, img[src] URLs may also be data: URI's matching mime types image/*. mailto: URLs are disallowed (and do not make sense for img[src] but were allowed under the a[href] whitelist used before.)
- Loading branch information
Showing
2 changed files
with
76 additions
and
27 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2551,15 +2551,38 @@ describe('$compile', function() { | |
expect(element.attr('src')).toBe('unsafe:javascript:doEvilStuff()'); | ||
})); | ||
|
||
it('should sanitize data: urls', inject(function($compile, $rootScope) { | ||
it('should sanitize non-image data: urls', inject(function($compile, $rootScope) { | ||
element = $compile('<img src="{{testUrl}}"></a>')($rootScope); | ||
$rootScope.testUrl = "data:evilPayload"; | ||
$rootScope.testUrl = "data:application/javascript;charset=US-ASCII,alert('evil!');"; | ||
$rootScope.$apply(); | ||
expect(element.attr('src')).toBe("unsafe:data:application/javascript;charset=US-ASCII,alert('evil!');"); | ||
$rootScope.testUrl = "data:,foo"; | ||
$rootScope.$apply(); | ||
expect(element.attr('src')).toBe("unsafe:data:,foo"); | ||
})); | ||
|
||
|
||
it('should not sanitize data: URIs for images', inject(function($compile, $rootScope) { | ||
element = $compile('<img src="{{dataUri}}"></img>')($rootScope); | ||
|
||
expect(element.attr('src')).toBe('unsafe:data:evilPayload'); | ||
// image data uri | ||
// ref: http://probablyprogramming.com/2009/03/15/the-tiniest-gif-ever | ||
$rootScope.dataUri = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="; | ||
$rootScope.$apply(); | ||
expect(element.attr('src')).toBe('data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=='); | ||
})); | ||
|
||
|
||
// Fails on IE < 10 with "TypeError: Access is denied" when trying to set img[src] | ||
if (!msie || msie > 10) { | ||
it('should sanitize mailto: urls', inject(function($compile, $rootScope) { | ||
element = $compile('<img src="{{testUrl}}"></a>')($rootScope); | ||
$rootScope.testUrl = "mailto:[email protected]"; | ||
$rootScope.$apply(); | ||
expect(element.attr('src')).toBe('unsafe:mailto:[email protected]'); | ||
})); | ||
} | ||
|
||
it('should sanitize obfuscated javascript: urls', inject(function($compile, $rootScope) { | ||
element = $compile('<img src="{{testUrl}}"></img>')($rootScope); | ||
|
||
|
@@ -2636,13 +2659,6 @@ describe('$compile', function() { | |
$rootScope.$apply(); | ||
expect(element.attr('src')).toBe('ftp://foo.com/bar'); | ||
|
||
// Fails on IE < 10 with "TypeError: Access is denied" when trying to set img[src] | ||
if (!msie || msie > 10) { | ||
$rootScope.testUrl = "mailto:[email protected]"; | ||
$rootScope.$apply(); | ||
expect(element.attr('src')).toBe('mailto:[email protected]'); | ||
} | ||
|
||
$rootScope.testUrl = "file:///foo/bar.html"; | ||
$rootScope.$apply(); | ||
expect(element.attr('src')).toBe('file:///foo/bar.html'); | ||
|
@@ -2660,8 +2676,8 @@ describe('$compile', function() { | |
|
||
it('should allow reconfiguration of the src whitelist', function() { | ||
module(function($compileProvider) { | ||
expect($compileProvider.urlSanitizationWhitelist() instanceof RegExp).toBe(true); | ||
var returnVal = $compileProvider.urlSanitizationWhitelist(/javascript:/); | ||
expect($compileProvider.imgSrcSanitizationWhitelist() instanceof RegExp).toBe(true); | ||
var returnVal = $compileProvider.imgSrcSanitizationWhitelist(/javascript:/); | ||
expect(returnVal).toBe($compileProvider); | ||
}); | ||
|
||
|
@@ -2812,8 +2828,8 @@ describe('$compile', function() { | |
|
||
it('should allow reconfiguration of the href whitelist', function() { | ||
module(function($compileProvider) { | ||
expect($compileProvider.urlSanitizationWhitelist() instanceof RegExp).toBe(true); | ||
var returnVal = $compileProvider.urlSanitizationWhitelist(/javascript:/); | ||
expect($compileProvider.aHrefSanitizationWhitelist() instanceof RegExp).toBe(true); | ||
var returnVal = $compileProvider.aHrefSanitizationWhitelist(/javascript:/); | ||
expect(returnVal).toBe($compileProvider); | ||
}); | ||
|
||
|