diff options
Diffstat (limited to 'src/ng')
| -rw-r--r-- | src/ng/compile.js | 34 | ||||
| -rw-r--r-- | src/ng/sanitizeUri.js | 74 | 
2 files changed, 86 insertions, 22 deletions
diff --git a/src/ng/compile.js b/src/ng/compile.js index 13fb9682..54d2dc9f 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -493,14 +493,12 @@ var $compileMinErr = minErr('$compile');   *   * @description   */ -$CompileProvider.$inject = ['$provide']; -function $CompileProvider($provide) { +$CompileProvider.$inject = ['$provide', '$$sanitizeUriProvider']; +function $CompileProvider($provide, $$sanitizeUriProvider) {    var hasDirectives = {},        Suffix = 'Directive',        COMMENT_DIRECTIVE_REGEXP = /^\s*directive\:\s*([\d\w\-_]+)\s+(.*)$/, -      CLASS_DIRECTIVE_REGEXP = /(([\d\w\-_]+)(?:\:([^;]+))?;?)/, -      aHrefSanitizationWhitelist = /^\s*(https?|ftp|mailto|tel|file):/, -      imgSrcSanitizationWhitelist = /^\s*(https?|ftp|file):|data:image\//; +      CLASS_DIRECTIVE_REGEXP = /(([\d\w\-_]+)(?:\:([^;]+))?;?)/;    // Ref: http://developers.whatwg.org/webappapis.html#event-handler-idl-attributes    // The assumption is that future DOM event attribute names will begin with @@ -584,10 +582,11 @@ function $CompileProvider($provide) {     */    this.aHrefSanitizationWhitelist = function(regexp) {      if (isDefined(regexp)) { -      aHrefSanitizationWhitelist = regexp; +      $$sanitizeUriProvider.aHrefSanitizationWhitelist(regexp);        return this; +    } else { +      return $$sanitizeUriProvider.aHrefSanitizationWhitelist();      } -    return aHrefSanitizationWhitelist;    }; @@ -614,18 +613,18 @@ function $CompileProvider($provide) {     */    this.imgSrcSanitizationWhitelist = function(regexp) {      if (isDefined(regexp)) { -      imgSrcSanitizationWhitelist = regexp; +      $$sanitizeUriProvider.imgSrcSanitizationWhitelist(regexp);        return this; +    } else { +      return $$sanitizeUriProvider.imgSrcSanitizationWhitelist();      } -    return imgSrcSanitizationWhitelist;    }; -    this.$get = [              '$injector', '$interpolate', '$exceptionHandler', '$http', '$templateCache', '$parse', -            '$controller', '$rootScope', '$document', '$sce', '$animate', +            '$controller', '$rootScope', '$document', '$sce', '$animate', '$$sanitizeUri',      function($injector,   $interpolate,   $exceptionHandler,   $http,   $templateCache,   $parse, -             $controller,   $rootScope,   $document,   $sce,   $animate) { +             $controller,   $rootScope,   $document,   $sce,   $animate,   $$sanitizeUri) {      var Attributes = function(element, attr) {        this.$$element = element; @@ -730,16 +729,7 @@ function $CompileProvider($provide) {          // sanitize a[href] and img[src] values          if ((nodeName === 'A' && key === 'href') ||              (nodeName === 'IMG' && key === 'src')) { -          // NOTE: urlResolve() doesn't support IE < 8 so we don't sanitize for that case. -          if (!msie || msie >= 8 ) { -            normalizedVal = urlResolve(value).href; -            if (normalizedVal !== '') { -              if ((key === 'href' && !normalizedVal.match(aHrefSanitizationWhitelist)) || -                  (key === 'src' && !normalizedVal.match(imgSrcSanitizationWhitelist))) { -                this[key] = value = 'unsafe:' + normalizedVal; -              } -            } -          } +          this[key] = value = $$sanitizeUri(value, key === 'src');          }          if (writeAttr !== false) { diff --git a/src/ng/sanitizeUri.js b/src/ng/sanitizeUri.js new file mode 100644 index 00000000..97325094 --- /dev/null +++ b/src/ng/sanitizeUri.js @@ -0,0 +1,74 @@ +'use strict'; + +/** + * @description + * Private service to sanitize uris for links and images. Used by $compile and $sanitize. + */ +function $$SanitizeUriProvider() { +  var aHrefSanitizationWhitelist = /^\s*(https?|ftp|mailto|tel|file):/, +    imgSrcSanitizationWhitelist = /^\s*(https?|ftp|file):|data:image\//; + +  /** +   * @description +   * Retrieves or overrides the default regular expression that is used for whitelisting of safe +   * urls during a[href] sanitization. +   * +   * The sanitization is a security measure aimed at prevent XSS attacks via html links. +   * +   * Any url about to be assigned to a[href] via data-binding is first normalized and turned into +   * an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist` +   * regular expression. If a match is found, the original url is written into the dom. Otherwise, +   * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM. +   * +   * @param {RegExp=} regexp New regexp to whitelist urls with. +   * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for +   *    chaining otherwise. +   */ +  this.aHrefSanitizationWhitelist = function(regexp) { +    if (isDefined(regexp)) { +      aHrefSanitizationWhitelist = regexp; +      return this; +    } +    return aHrefSanitizationWhitelist; +  }; + + +  /** +   * @description +   * Retrieves or overrides the default regular expression that is used for whitelisting of safe +   * urls during img[src] sanitization. +   * +   * The sanitization is a security measure aimed at prevent XSS attacks via html links. +   * +   * Any url about to be assigned to img[src] via data-binding is first normalized and turned into +   * an absolute url. Afterwards, the url is matched against the `imgSrcSanitizationWhitelist` +   * regular expression. If a match is found, the original url is written into the dom. Otherwise, +   * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM. +   * +   * @param {RegExp=} regexp New regexp to whitelist urls with. +   * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for +   *    chaining otherwise. +   */ +  this.imgSrcSanitizationWhitelist = function(regexp) { +    if (isDefined(regexp)) { +      imgSrcSanitizationWhitelist = regexp; +      return this; +    } +    return imgSrcSanitizationWhitelist; +  }; + +  this.$get = function() { +    return function sanitizeUri(uri, isImage) { +      var regex = isImage ? imgSrcSanitizationWhitelist : aHrefSanitizationWhitelist; +      var normalizedVal; +      // NOTE: urlResolve() doesn't support IE < 8 so we don't sanitize for that case. +      if (!msie || msie >= 8 ) { +        normalizedVal = urlResolve(uri).href; +        if (normalizedVal !== '' && !normalizedVal.match(regex)) { +          return 'unsafe:'+normalizedVal; +        } +      } +      return uri; +    }; +  }; +}  | 
