【问题标题】: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

      【讨论】:

        猜你喜欢
        • 2018-07-23
        • 1970-01-01
        • 2021-07-19
        • 2016-12-26
        • 1970-01-01
        • 2020-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多