如何在NodeJS/Express中验证base64映像



假设我正在使用Node/Express创建一个REST API,并且通过JSON在客户端和服务器之间交换数据。

用户正在填写注册表,其中一个字段是用于上传个人资料图像的图像输入。图像不能通过JSON发送,因此必须转换为base64字符串。

如何验证这是否是服务器端图像的base64字符串?还是最好不要将配置文件图像作为base64发送?

您可以首先检查字符串是否是base64映像,是否具有正确的mime类型
我发现npm注册表上的这个库正是这样做的(未测试(。

const isBase64 = require('is-base64');
let base64str_img = 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAoHBwgHBgoIC...ljA5GC68sN8AoXT/AF7fw7//2Q==';
console.log(isBase64(base64str_img, { mime: true })); // true

然后,你可以验证你的应用程序中是否允许mime类型,或者进行其他验证,比如尝试显示图像文件并捕捉可能的错误。

无论如何,如果你想真正确定用户输入,首先你必须自己处理。这是你应该关心的最佳做法。

Base64值只有当其解码的数据具有正确的MIME类型并且宽度和高度大于零时,它才是有效的图像。检查这一切的一个方便方法是安装jimp包并按如下方式使用:

var b64 = 'R0lGODdhAQADAPABAP////8AACwAAAAAAQADAAACAgxQADs=',
buf = Buffer.from(b64, 'base64');
require('jimp').read(buf).then(function (img) {
if (img.bitmap.width > 0 && img.bitmap.height > 0) {
console.log('Valid image');
} else {
console.log('Invalid image');
}
}).catch (function (err) {
console.log(err);
});

我想做一些类似的事情,但最终在谷歌上搜索却一无所获,所以我制作了自己的base64验证器:

function isBase64(text) {
let utf8 = Buffer.from(text).toString("utf8");
return !(/[^x00-x7f]/.test(utf8));
}

这不太好,因为我把它用于不同的目的,但你可能可以在它的基础上构建,这里有一个使用atob来防止无效的base64字符的例子(否则会忽略它们(:

function isBase64(text) {
try {
let utf8 = atob(text);
return !(/[^x00-x7f]/.test(utf8));
} catch (_) {
return false;
}
}

现在,关于它的工作原理:Buffer.from(text, "base64")从字符串中删除所有无效的base64字符,然后将字符串转换为缓冲区,toString("utf8")将缓冲区转换为字符串。atob做了类似的事情,但它不会删除无效字符,而是在遇到错误时抛出错误(因此是try...catch(。

如果解码字符串中的所有字符都属于ASCII字符集,则!(/[^x00-x7f]/.test(utf8))将返回true,否则返回false。这可以更改为使用较小的字符集,例如,如果所有字符都是字母数字,则[^x30-x39x41-x5ax61-x7a]将仅返回true

最新更新