服务器端验证,以验证上传的文件是否为实际图像

Server-side validation to verify an uploaded file is an actual image

提问人:macalaca 提问时间:3/23/2019 更新时间:3/23/2019 访问量:623

问:

我正在构建一个非常简单的端点来更改用户的个人资料照片,但找不到有关如何验证上传的文件是否为真实图像的详细信息。在服务器上,我可以根据标头轻松过滤掉对端点的请求;如果标头不是我要强制执行的类型之一,则返回 400。考虑到我只想接收 png、jpg 或 jpeg 的图像;我的终结点将具有如下所示的条件:Content-Type

const validImageMimeTypes = ['image/jpeg', 'image/jpg', 'image/png']

router.put('/:id/avatar', (req, res) => {
  if (!validImageMimeTypes.includes(req.get('content-type'))) {
    res.status(400)
    res.send("Unsupported file type")
    return
  }
  ...
}

这很好,但它不会阻止用户将文件的扩展名更改为强制扩展名之一并上传它。我试着用我的 Github 头像图片来做这件事,他们的服务器端能够发现我上传的内容不是真实的图像:

{"message":"Expected formats \"png,jpg,gif\", got \"unknown\"",
 "request_id":"F5F0:365D:1EC5D9:226D70:5C94E2AB",
 "errors":[{"resource":"upload","code":"content_mismatch","field":"format"}]}

一般而言,他们是如何实现此验证的?他们是否使用库从图像中获取简单属性,例如大小和宽度,如果失败,则返回 400?我应该注意哪些行业惯例?

谢谢

验证 安全 映像上传 服务器端

评论


答:

0赞 macalaca 3/23/2019 #1

我找到了一个 JavaScript 包来做我需要的事情。它得到了积极的维护,并且适用于我需要检查的文件类型。