Самое простое решение - внедрить какое-то промежуточное программное обеспечение для ограничения скорости. Простой пример использования express-rate-limit
const server = new ApolloServer({ typeDefs, resolvers })
const app = express()
const limitMiddleware = rateLimit({
windowMs: 15 * 60 * 1000,
max: 100,
})
app.use(limitMiddleware)
server.applyMiddleware({ app })
app.listen({ port: 4000 })
По умолчанию промежуточное программное обеспечение отключает IP-адрес запроса, но если вы хотите получить более детальную информацию и выделять ключ как из IP-адреса, так и из имени поля запроса (например), вы можете проанализировать тело запроса, используя graphql-tag
, и сгенерировать ключ соответственно.
GraphQL представляет некоторые уникальные проблемы безопасности. Вы можете взглянуть на эту статью для более глубокого обсуждения, но в дополнение к ограничению скорости вы можете также рассмотреть следующие меры:
- Ограничение суммы - использование лимитов на уровне хранилища, использование пользовательских скаляров или реализация проверок внутри распознавателей для предотвращения возврата слишком большого количества одной "вещи" за раз
- Ограничение глубины запроса -
graphql-depth-limit
- Ограничение общей сложности запроса и стоимости -
graphql-validation-complexity
и graphql-cost-analysis
Хотя эти инструменты не обязательно соответствуют сценарию в вашем вопросе, я все же рассмотрел бы использование некоторой их комбинации, когда вы углубитесь в выяснение, как защитить вашу конечную точку.