【问题标题】:How do I validate base64 images in NodeJS/Express?如何在 NodeJS/Express 中验证 base64 图像?
【发布时间】:2018-12-13 15:06:23
【问题描述】:
假设我正在使用 Node/Express 创建一个 REST API,并通过 JSON 在客户端和服务器之间交换数据。
用户正在填写注册表单,其中一个字段是用于上传个人资料图片的图片输入。图像不能通过 JSON 发送,因此必须转换为 base64 字符串。
如何验证这确实是服务器端图像的 base64 字符串?或者最好不要将个人资料图片作为 base64 发送?
【问题讨论】:
标签:
node.js
express
base64
【解决方案1】:
您可以首先检查字符串是否为 base64 图像,并具有正确的 mime 类型。
我在 npm 注册表上发现 this library 正是这样做的(未经测试)。
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 类型,或者进行其他验证,例如尝试显示图像文件并捕获可能的错误。
无论如何,如果您想真正确定用户输入,首先您必须自己处理。这是您应该关注的最佳做法。
【解决方案2】:
只有当其解码数据具有正确的 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);
});
【解决方案3】:
我想做类似的事情,结果用谷歌搜索了,什么也没找到,所以我做了自己的 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-\x39\x41-\x5a\x61-\x7a] 将仅在所有字符都是字母数字时返回 true。