Я создаю очень простую конечную точку для изменения фотографии профиля пользователя и не могу найти подробную информацию о том, как проверить, что загруженный файл является реальным изображением.На сервере я могу легко отфильтровать запросы к моей конечной точке на основе заголовка 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?Какие отраслевые практики я должен знать?
Спасибо