đ ââïž Pourquoi GraphQL ne devrait pas ĂȘtre dans le core de WordPress
Mise Ă jour 01/05/2024 : Consultez la comparaison Gato GraphQL vs WP REST API.
Oui, vous avez bien lu ce titre. MĂȘme si je suis moi-mĂȘme le crĂ©ateur d'un serveur GraphQL pour WordPress, j'ai changĂ© d'avis concernant l'opportunitĂ© ou non que WordPress soit livrĂ© avec GraphQL.
Il n'y a pas si longtemps, je croyais que GraphQL devrait ĂȘtre dans le core de WordPress. La logique Ă©tait que les contributeurs dĂ©pensaient du temps et des efforts Ă implĂ©menter des fonctionnalitĂ©s pour la WP REST API (opĂ©rations en lot) qui sont natives Ă GraphQL.
Cependant, j'ai rĂ©cemment appris de nouvelles informations qui m'ont fait rĂ©flĂ©chir, et je crois maintenant que WordPress ne devrait pas ĂȘtre livrĂ© avec GraphQL, en raison des risques supplĂ©mentaires.

Voici mes raisons.
1. Cela ne satisfait pas la rĂšgle 80/20
Historiquement, une certaine fonctionnalité n'est ajoutée au core de WordPress que si elle satisfait la rÚgle 80/20, ce qui signifie que 80 % ou plus des utilisateurs l'utiliseront.
Serait-ce le cas avec GraphQL ? Je pense que la réponse est « non », en me basant sur le précédent de l'introduction de la WP REST API dans WordPress 4.7.
Dans sa confĂ©rence WordPress as Data, 5 Years In, K. Adam White (principal responsable du dĂ©veloppement initial et de la publication de la WP REST API) a dĂ©crit que les contributeurs s'attendaient Ă ce que la REST API soit largement utilisĂ©e une fois publiĂ©e avec le core. Mais cela ne s'est pas produit : les dĂ©veloppeurs ont continuĂ© Ă crĂ©er des sites WordPress de la mĂȘme maniĂšre qu'auparavant, en prĂȘtant peu d'attention au « headless » ou Ă la REST API.
La situation a changé seulement plus tard, avec l'introduction de l'éditeur Gutenberg dans WordPress 5.0, qui était basé sur la REST API. Gutenberg pourrait-il alors justifier l'ajout de GraphQL au core de WordPress ?

2. Le headless est déjà satisfait via la REST API
L'Ă©diteur WordPress peut ĂȘtre amĂ©liorĂ© avec un serveur GraphQL natif, permettant aux dĂ©veloppeurs de blocs d'utiliser GraphQL (en plus de la REST API existante) pour rĂ©cupĂ©rer des donnĂ©es pour leurs blocs. De plus, les thĂšmes et plugins pourraient utiliser GraphQL pour alimenter leur propre fonctionnalitĂ© interne. Ce sont de bonnes raisons d'ajouter GraphQL au core de WordPress.
Cependant, WordPress dispose dĂ©jĂ de la REST API, et tout ce que vous pouvez faire avec GraphQL peut Ă©galement ĂȘtre fait avec REST. Introduire GraphQL en plus de REST, c'est comme acheter une BMW alors que vous conduisez dĂ©jĂ une Toyota. Vous arriverez Ă destination plus vite, et l'expĂ©rience de conduite sera plus agrĂ©able. Mais les deux voitures vous emmĂšneront lĂ oĂč vous voulez aller.
Comme GraphQL ne fournira pas une fonctionnalitĂ© prĂ©alablement indisponible, son inclusion dans le core n'est pas pleinement justifiĂ©e. GraphQL amĂ©liorerait certainement l'expĂ©rience d'interaction avec l'API, mais cela pourrait parfaitement ĂȘtre considĂ©rĂ© comme relevant du domaine des plugins.

3. Les thĂšmes et plugins WordPress peuvent utiliser webonyx/graphql-php
Les plugins publics ne peuvent pas exiger qu'un site web installe WPGraphQL ou Gato GraphQL pour utiliser le plugin, car cela diminuerait leur portée potentielle. En tant que tel, les plugins publics ne peuvent pas s'appuyer sur GraphQL, et c'est vraiment dommage.
J'ai beaucoup réfléchi à ce problÚme, et j'ai trouvé une solution potentielle : la GraphQL API Private, un moteur GraphQL autonome que les plugins peuvent intégrer pour leur propre usage, distribué comme un package Composer. (Je n'ai pas encore commencé à travailler sur ce projet.)
Mais ensuite, il y a quelques semaines, un plugin WordPress propulsé par GraphQL a été publié. Je me suis demandé comment l'auteur l'avait fait : utiliserait-il WPGraphQL ou Gato GraphQL sous le capot ? J'ai donc examiné son code source et, il s'avÚre qu'il utilise directement webonyx/graphql-php !
C'est une solution intéressante, qui démontre qu'avec un peu d'effort, les développeurs ont actuellement accÚs à GraphQL pour leurs thÚmes et plugins.
Ce plugin utilise GraphQL pour récupérer ses propres entités de données, et non celles de WordPress (articles, utilisateurs, commentaires, etc.). Il n'a donc pas besoin de recréer le schéma GraphQL contenant le modÚle de données WordPress, comme le font WPGraphQL et Gato GraphQL (et éventuellement la GraphQL API Private). En tant que tel, s'appuyer sur webonyx/graphql-php a du sens.

4. GraphQL présente des risques supplémentaires
Les trois problĂšmes ci-dessus suggĂšrent que GraphQL amĂ©liorerait WordPress, mĂȘme si ce n'est pas extrĂȘmement convaincant. Dans cette perspective, nous pourrions quand mĂȘme ajouter GraphQL au core de WordPress, et en bĂ©nĂ©ficier ou ne rien changer.
Mais ce 4Ăšme problĂšme suggĂšre que, si GraphQL n'apportera pas beaucoup de valeur Ă WordPress, il ne devrait pas ĂȘtre ajoutĂ©, en raison de ses risques supplĂ©mentaires.
GraphQL est susceptible aux vecteurs d'attaque suivants (parmi d'autres) :
- Le endpoint unique donne accÚs à toutes les informations du site web, de sorte que nous pourrions avoir des données privées exposées involontairement.
- Les requĂȘtes peuvent ĂȘtre trĂšs complexes et peuvent surcharger les serveurs web et de base de donnĂ©es.
- La mĂȘme mutation peut ĂȘtre exĂ©cutĂ©e plusieurs fois dans une seule requĂȘte, et plusieurs requĂȘtes peuvent ĂȘtre exĂ©cutĂ©es ensemble dans une seule demande, permettant aux attaquants de tenter d'accĂ©der au back-end en fournissant de nombreuses combinaisons d'utilisateur/mot de passe.
Ces attaques peuvent ĂȘtre vraiment dommageables. Dans sa prĂ©sentation Damn GraphQL - Defending and Attacking APIs, le chercheur en cybersĂ©curitĂ© Dolev Farhi a rĂ©ussi Ă faire tomber un site WordPress en moins de 30 secondes, en attaquant le endpoint WPGraphQL avec un lot de requĂȘtes complexes.
L'Ă©quipe WPGraphQL a corrigĂ© le problĂšme immĂ©diatement. Mais comment pouvons-nous ĂȘtre sĂ»rs qu'aucun autre exploit ne peut se produire ? (Je veux dire non seulement WPGraphQL, mais Gato GraphQL aussi.)
Ces attaques peuvent se produire avec GraphQL, et pas avec REST, parce que GraphQL est plus puissant que REST. Alors qu'en REST la requĂȘte est dĂ©finie Ă l'avance et stockĂ©e dans le serveur, en GraphQL elle est fournie Ă l'exĂ©cution par le client (Ă moins d'utiliser des Persisted queries).
Si les administrateurs de sites web sont négligents dans la configuration de qui peut accéder au endpoint, ou quelles données sont exposées, de mauvaises choses peuvent arriver. Et en raison de la popularité de WordPress, qui est utilisé par des millions de personnes qui ne sont pas expertes en technologie, de mauvaises choses se produiront trÚs probablement.

En conclusion
Juste pour ĂȘtre clair : je ne plaide pas pour ne pas utiliser GraphQL dans WordPress (bien sĂ»r que non !), mais pour utiliser GraphQL de maniĂšre responsable. GraphQL est puissant, ce qui signifie qu'il est dangereux. Lors de l'utilisation de GraphQL, nous devons nous assurer que nous savons ce que nous faisons.
Livrer GraphQL dans le core de WordPress le mettrait entre les mains de nombreuses personnes, dont beaucoup ne seront pas conscientes de ses risques et ne prendront pas les mesures appropriĂ©es. C'est une recette pour un dĂ©sastre potentiel. Et en tant que tel, c'est maintenant mon opinion, cela devrait ĂȘtre Ă©vitĂ©.