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

时间:2019-03-22 16:10:14

标签: validation security image-uploading server-side

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

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?我应该知道的任何行业惯例吗?

谢谢

1 个答案:

答案 0 :(得分:0)

我发现一个JavaScript package可以完全满足我的需求。它已经过积极维护,并且可以很好地处理我需要检查的文件类型。