首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在NodeJS/Express中验证base64镜像?

如何在NodeJS/Express中验证base64镜像?
EN

Stack Overflow用户
提问于 2018-12-13 23:06:23
回答 3查看 5.5K关注 0票数 4

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

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

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

EN

回答 3

Stack Overflow用户

发布于 2018-12-14 04:44:16

您可以从检查字符串是否是具有适当mime类型的base64图像开始。

我发现npm注册表上的this library确实做到了这一点(未经过测试)。

代码语言:javascript
复制
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类型,或者进行其他验证,如尝试显示图像文件并捕获可能的错误。

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

票数 4
EN

Stack Overflow用户

发布于 2018-12-14 14:56:58

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2021-07-16 23:33:25

我想做一些类似的事情,但最终谷歌了一下,什么也没找到,所以我做了自己的base64验证器:

代码语言:javascript
复制
function isBase64(text) {
    let utf8 = Buffer.from(text).toString("utf8");
    return !(/[^\x00-\x7f]/.test(utf8));
}

这不是很好,因为我将它用于不同的目的,但您可以在它的基础上进行构建,下面是一个使用atob来防止无效base64字符的示例(否则它们将被忽略):

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53764734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档