验证 Base64 正则表达式导致 RangeError 超出最大调用堆栈大小

Validate Base64 Regex causes RangeError Maximum call stack size exceeded

提问人:Debaleen Sengupta 提问时间:11/11/2023 最后编辑:Roko C. BuljanDebaleen Sengupta 更新时间:11/11/2023 访问量:34

问:

我有一个正则表达式,需要检查 base64 是否有效。目前我在 NodeJS 中的代码如下所示:

let base64regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/;
if (base64regex.test(Payload.fileData) === true) {
 //Further process the filedata
}

对于不超过 1.6MB 的较小 base64 文件,正则表达式工作正常,但对于较大的文件 (>2MB),它会导致:

RangeError: Maximum call stack size exceeded
    at RegExp.test (<anonymous>)

如何在不导致堆栈大小超过错误的情况下接受更大的 base64 数据?

我在stackoverflow上看到了示例,但他们都没有遇到过这个问题。base64regex.test() 调用是否递归发生?如果是这样,我该如何解决这个问题?

JavaScript 节点 .js 正则表达式 base64

评论


答:

0赞 Roko C. Buljan 11/11/2023 #1

而不是 RegExp - 这可能会导致像这样的最大调用堆栈大小问题,
您可以尝试使用另一种方法,例如:

const isValidBase64 = b => {
  try {
    return b.length > 3 && !(b.length % 4) && atob(b) && true;
  } catch(err) {
    return false;
  }
}

// Example:
console.log(
  isValidBase64(""),         // false
  isValidBase64("a"),        // false
  isValidBase64("aZ="),      // false
  isValidBase64("aZ+9===="), // false
  isValidBase64("aZ+9/Š=="), // false
  isValidBase64("aZ+9"),     // true
  isValidBase64("aZ+9/B=="), // true
);

(使用尺寸为 >18Mb) 的图像进行测试)