Безопасная загрузка файлов
jasyes opened this issue · comments
Я полностью поддерживаю подход, что файлы нужно грузить на REST эндпоинты и передавать ссылку на файлы в GraphQL мутацию.
Единственное хотелось бы добавить о безопасности такого запроса, для того чтобы не проверять был ли файл в прошлом уже назначен объекту (а если в бэкэнде есть проверка на дубликаты и один файл может назначен нескольким объектам тогда такая проверка не поможет).
Рекомендуемый выход из данной ситуации это вместе с ссылкой передавать подписанный токен JWT с указанием ID: файла в объектном хранилище или можно ссылку засунуть внутрь JWT.
Сервер проверяет токен и только после этого назначает ссылку. В противном случае есть вероятность, что злоумышленник начнет перебор ссылок или ID файла для того, чтобы получить доступ к файлу (если конечно стоит ограничение на то, что только определенные группы пользователей имеют доступ к файлу).
Могу немного дополнить метод, каким образом я поступил:
Для хранения файлов используется minio (s3 совместимое хранилище).
Происходит мутация, перед загрузкой файла, получает подписанную ссылку на загрузку.
После чего происходит загрузка файла, по подписанной ссылке (тут уже не участвует graphql).
Когда загрузка завершена, приходит еще мутация, для подтверждения загрузки с названием файла и его размером. Graphql проверяет размер и заносит в бд название файла, пользователя, что загрузил файл и размер. Если размер отличается - все зависит от логики, в моем случае удаляется файл и дается новая ссылка для загрузки, по тому же пути.
При отдачи файлов, также подписывается ссылка в зависимости от доступов, то есть напрямую или перебором файл не получить.
Плюс подхода - graphql не управляет загрузкой в принципе, особенно когда это множество файлов, это значительно снижает нагрузку на канал и сам graphql.