假设我正在使用Node/Express创建一个REST API,并通过JSON在客户端和服务器之间交换数据。
用户正在填写注册表,其中一个字段是用于上传个人资料图像的图像输入。图像不能通过JSON发送,因此必须转换为base64字符串。
如何验证这确实是服务器端图像的base64字符串?或者,最好不要将配置文件图像作为base64发送?
发布于 2018-12-14 04:44:16
您可以从检查字符串是否是具有适当mime类型的base64图像开始。
我发现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类型,或者进行其他验证,如尝试显示图像文件并捕获可能的错误。
无论如何,如果你想真正确定用户输入,你必须首先自己处理它。这是您应该关心的最佳实践。
发布于 2018-12-14 14:56:58
只有当解码的数据具有正确的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);
});
发布于 2021-07-16 23:33:25
我想做一些类似的事情,但最终谷歌了一下,什么也没找到,所以我做了自己的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
。
https://stackoverflow.com/questions/53764734
复制相似问题