From f9c0cfb26c4b5324a3b2d349c6f54d652f7e4abb Mon Sep 17 00:00:00 2001 From: Chris O'Hara Date: Fri, 19 Feb 2016 16:00:13 +0900 Subject: [PATCH 1/4] Add some more test vectors --- test/validators.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/test/validators.js b/test/validators.js index 251103043..5f7bdc31f 100644 --- a/test/validators.js +++ b/test/validators.js @@ -1425,7 +1425,13 @@ describe('Validators', function () { test({ validator: 'isBase64' , valid: [ - 'TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4=' + 'Zg==' + , 'Zm8=' + , 'Zm9v' + , 'Zm9vYg==' + , 'Zm9vYmE=' + , 'Zm9vYmFy' + , 'TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4=' , 'Vml2YW11cyBmZXJtZW50dW0gc2VtcGVyIHBvcnRhLg==' , 'U3VzcGVuZGlzc2UgbGVjdHVzIGxlbw==' , 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuMPNS1Ufof9EW/M98FNw'+ @@ -1440,6 +1446,10 @@ describe('Validators', function () { '12345' , '' , 'Vml2YW11cyBmZXJtZtesting123' + , 'Zg=' + , 'Zm=8' + , '=m9vYg==' + , 'Zm9vYmFy====' ] }); for (var i = 0, str = '', encoded; i < 1000; i++) { From 38a5271724264c9887a64d8b9d242699234cd73f Mon Sep 17 00:00:00 2001 From: Chris O'Hara Date: Fri, 19 Feb 2016 16:06:23 +0900 Subject: [PATCH 2/4] Don't use regex to validate base64 --- validator.js | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/validator.js b/validator.js index dcc9e4599..5f82c41f5 100644 --- a/validator.js +++ b/validator.js @@ -104,7 +104,8 @@ var surrogatePair = /[\uD800-\uDBFF][\uDC00-\uDFFF]/; - var base64 = /^(?:[A-Z0-9+\/]{4})*(?:[A-Z0-9+\/]{2}==|[A-Z0-9+\/]{3}=|[A-Z0-9+\/]{4})$/i; + var notBase64 = /[^A-Z0-9+\/=]/i + , lastBase64Block = /^(?:[^=]{2}==|[^=]{3}=|[^=]{4})$/i; var phones = { 'en-US': /^(\+?1)?[2-9]\d{2}[2-9](?!11)\d{6}$/, @@ -834,7 +835,19 @@ }; validator.isBase64 = function (str) { - return base64.test(str); + var len = str.length; + if (len % 4 !== 0) { + return false; + } + if (notBase64.test(str)) { + return false; + } + var firstPaddingChar = str.indexOf('='); + if (firstPaddingChar >= 0 && len - firstPaddingChar > 4) { + return false; + } + var lastBlock = str.substring(len - 4); + return lastBase64Block.test(lastBlock); }; validator.isMongoId = function (str) { From 1bd5b1fc55e290fc5a9f14afcf5d5cef4aa67ea8 Mon Sep 17 00:00:00 2001 From: Chris O'Hara Date: Sat, 20 Feb 2016 15:07:42 +0900 Subject: [PATCH 3/4] Check padding in the last block --- test/validators.js | 1 + validator.js | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/test/validators.js b/test/validators.js index 5f7bdc31f..b835cf860 100644 --- a/test/validators.js +++ b/test/validators.js @@ -1447,6 +1447,7 @@ describe('Validators', function () { , '' , 'Vml2YW11cyBmZXJtZtesting123' , 'Zg=' + , 'Z===' , 'Zm=8' , '=m9vYg==' , 'Zm9vYmFy====' diff --git a/validator.js b/validator.js index 5f82c41f5..2fa315929 100644 --- a/validator.js +++ b/validator.js @@ -104,8 +104,7 @@ var surrogatePair = /[\uD800-\uDBFF][\uDC00-\uDFFF]/; - var notBase64 = /[^A-Z0-9+\/=]/i - , lastBase64Block = /^(?:[^=]{2}==|[^=]{3}=|[^=]{4})$/i; + var notBase64 = /[^A-Z0-9+\/=]/i; var phones = { 'en-US': /^(\+?1)?[2-9]\d{2}[2-9](?!11)\d{6}$/, @@ -836,18 +835,19 @@ validator.isBase64 = function (str) { var len = str.length; - if (len % 4 !== 0) { - return false; - } - if (notBase64.test(str)) { + if (!len || len % 4 !== 0 || notBase64.test(str)) { return false; } var firstPaddingChar = str.indexOf('='); - if (firstPaddingChar >= 0 && len - firstPaddingChar > 4) { - return false; + if (firstPaddingChar >= 0) { + if (len - firstPaddingChar > 2) { + return false; + } + if (firstPaddingChar < len - 1 && str[len - 1] !== '=') { + return false; + } } - var lastBlock = str.substring(len - 4); - return lastBase64Block.test(lastBlock); + return true; }; validator.isMongoId = function (str) { From ebcca98232399b8404ca6b0ec842ab4596329d58 Mon Sep 17 00:00:00 2001 From: Chris O'Hara Date: Sat, 20 Feb 2016 15:09:33 +0900 Subject: [PATCH 4/4] Condense the if blocks --- validator.js | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/validator.js b/validator.js index 2fa315929..f1e9a7753 100644 --- a/validator.js +++ b/validator.js @@ -839,15 +839,9 @@ return false; } var firstPaddingChar = str.indexOf('='); - if (firstPaddingChar >= 0) { - if (len - firstPaddingChar > 2) { - return false; - } - if (firstPaddingChar < len - 1 && str[len - 1] !== '=') { - return false; - } - } - return true; + return firstPaddingChar === -1 || + firstPaddingChar === len - 1 || + (firstPaddingChar === len - 2 && str[len - 1] === '='); }; validator.isMongoId = function (str) {