Предотвращение повторных запросов в Apollo Server 2 - PullRequest
0 голосов
/ 01 ноября 2018

В целях безопасности я ищу способ запретить плохим игрокам отправлять повторные запросы на сервер снова и снова, так как это может привести к низкой производительности выполнения и / или высокой цене развертывания.

В документации Apollo Server есть ссылка на то, как реализовать наш собственный кеш-сервер с использованием KeyValueCache, но я просто не уверен, как его использовать, чтобы повторные запросы не выполнялись несколько раз.

Может быть, я не смотрю весь вопрос под прямым углом, поэтому, если у вас есть какие-либо предложения, это было бы очень полезно.

Спасибо

1 Ответ

0 голосов
/ 01 ноября 2018

Самое простое решение - внедрить какое-то промежуточное программное обеспечение для ограничения скорости. Простой пример использования 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 представляет некоторые уникальные проблемы безопасности. Вы можете взглянуть на эту статью для более глубокого обсуждения, но в дополнение к ограничению скорости вы можете также рассмотреть следующие меры:

  1. Ограничение суммы - использование лимитов на уровне хранилища, использование пользовательских скаляров или реализация проверок внутри распознавателей для предотвращения возврата слишком большого количества одной "вещи" за раз
  2. Ограничение глубины запроса - graphql-depth-limit
  3. Ограничение общей сложности запроса и стоимости - graphql-validation-complexity и graphql-cost-analysis

Хотя эти инструменты не обязательно соответствуют сценарию в вашем вопросе, я все же рассмотрел бы использование некоторой их комбинации, когда вы углубитесь в выяснение, как защитить вашу конечную точку.

...