diff --git a/lib/helpers/isURLSameOrigin.js b/lib/helpers/isURLSameOrigin.js index f1d89ad19d..a9a8e184c7 100644 --- a/lib/helpers/isURLSameOrigin.js +++ b/lib/helpers/isURLSameOrigin.js @@ -1,6 +1,7 @@ 'use strict'; var utils = require('./../utils'); +var isValidXss = require('./isValidXss'); module.exports = ( utils.isStandardBrowserEnv() ? @@ -21,6 +22,10 @@ module.exports = ( function resolveURL(url) { var href = url; + if (isValidXss(url)) { + throw new Error('URL contains XSS injection attempt'); + } + if (msie) { // IE needs attribute set twice to normalize properties urlParsingNode.setAttribute('href', href); diff --git a/lib/helpers/isValidXss.js b/lib/helpers/isValidXss.js new file mode 100644 index 0000000000..3c834a7cfa --- /dev/null +++ b/lib/helpers/isValidXss.js @@ -0,0 +1,7 @@ +'use strict'; + +module.exports = function isValidXss(requestURL) { + var xssRegex = /(\b)(on\w+)=|javascript|(<\s*)(\/*)script/gi; + return xssRegex.test(requestURL); +}; + diff --git a/test/specs/helpers/isURLSameOrigin.spec.js b/test/specs/helpers/isURLSameOrigin.spec.js index c26c770351..ab43472636 100644 --- a/test/specs/helpers/isURLSameOrigin.spec.js +++ b/test/specs/helpers/isURLSameOrigin.spec.js @@ -8,4 +8,10 @@ describe('helpers::isURLSameOrigin', function () { it('should detect different origin', function () { expect(isURLSameOrigin('https://github.com/axios/axios')).toEqual(false); }); + + it('should detect XSS scripts on a same origin request', function () { + expect(function() { + isURLSameOrigin('https://github.com/axios/axios?'); + }).toThrowError(Error, 'URL contains XSS injection attempt') + }); }); diff --git a/test/specs/helpers/isValidXss.spec.js b/test/specs/helpers/isValidXss.spec.js new file mode 100644 index 0000000000..dcfcf9d772 --- /dev/null +++ b/test/specs/helpers/isValidXss.spec.js @@ -0,0 +1,25 @@ +var isValidXss = require('../../../lib/helpers/isValidXss'); + +describe('helpers::isValidXss', function () { + it('should detect script tags', function () { + expect(isValidXss("")).toBe(true); + expect(isValidXss("")).toBe(true); + expect(isValidXss("")).toBe(true); + expect(isValidXss("xss")).toBe(true); + expect(isValidXss("")).toBe(true); + expect(isValidXss("onerror=alert('XSS')")).toBe(true); + expect(isValidXss("Click Me")).toBe(true); + }); + + it('should not detect non script tags', function() { + expect(isValidXss("/one/?foo=bar")).toBe(false); + expect(isValidXss(" tags")).toBe(false); + expect(isValidXss("")).toBe(false); + expect(isValidXss(">>> safe <<<")).toBe(false); + expect(isValidXss("<<< safe >>>")).toBe(false); + expect(isValidXss("my script rules")).toBe(false); + expect(isValidXss("")).toBe(false); + expect(isValidXss("

MyTitle

")).toBe(false); + expect(isValidXss("")).toBe(false); + }) +});