Comment empêcher une attaque imbriquée contre un serveur Apollo avec une requête telle que:
{
authors {
firstName
posts {
title
author {
firstName
posts{
title
author {
firstName
posts {
title
[n author]
[n post]
}
}
}
}
}
}
}
En d'autres termes, comment pouvez-vous limiter le nombre de récurrences soumises dans une requête? Cela pourrait être une vulnérabilité potentielle du serveur.
Au moment de la rédaction de ce document, GraphQL-JS ou Apollo Server ne comportait pas de fonction intégrée permettant de résoudre ce problème, mais cette solution devrait certainement avoir une solution simple à mesure que GraphQL gagne en popularité. Cette préoccupation peut être résolue avec plusieurs approches à plusieurs niveaux de la pile, et doit également toujours être combinée à une limitation de débit, de sorte que les personnes ne puissent pas envoyer trop de requêtes à votre serveur (c'est un problème potentiel avec REST ainsi que).
Je vais simplement énumérer toutes les différentes méthodes auxquelles je peux penser, et je vais essayer de garder cette réponse à jour au fur et à mesure que ces solutions sont implémentées dans divers serveurs GraphQL. Certains d'entre eux sont assez simples, et d'autres sont plus complexes.
(1) et (2) en particulier sont probablement quelque chose que tout serveur GraphQL devrait avoir par défaut, d’autant plus que de nombreux nouveaux développeurs risquent de ne pas être conscients de ces préoccupations. (3) ne fonctionnera que pour certains types d’applications, mais pourrait constituer un bon choix lorsque les performances ou les exigences de sécurité sont très strictes.
Pour compléter le point 4 de la réponse de stubailo, voici quelques implémentations de Node.js qui imposent bornes de coût et de profondeur aux documents GraphQL entrants.
Ce sont des règles personnalisées qui complètent la phase de validation.
Pour limiter les coûts de la requête, vous pouvez utiliser graphql-cost-analysis
Il s'agit d'une règle de validation qui analyse la requête avant de l'exécuter. Dans votre serveur GraphQL, il vous suffit d’affecter une configuration de coût à chaque champ de votre mappe de types de schéma de votre choix.
Une variante de la liste blanche des requêtes est query signature .
Pendant le processus de construction, chaque requête est signée de manière cryptographique à l'aide d'un secret partagé avec le serveur mais non associé au client. Ensuite, au moment de l'exécution, le serveur peut valider qu'une requête est authentique.
L'avantage par rapport à la liste blanche est que l'écriture de requêtes dans le client ne nécessite aucune modification du serveur. Cela est particulièrement utile si plusieurs clients accèdent au même serveur (applications Web, de bureau et mobiles, par exemple).
Ne manquez pas graphql-rate-limit ???? une directive GraphQL pour ajouter une limitation de débit simple mais granulaire à vos requêtes ou mutations.