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);
+ })
+});