QueryComplexityLimiter.php 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. declare(strict_types=1);
  7. namespace Magento\Framework\GraphQl\Query;
  8. use GraphQL\Validator\DocumentValidator;
  9. use GraphQL\Validator\Rules\DisableIntrospection;
  10. use GraphQL\Validator\Rules\QueryDepth;
  11. use GraphQL\Validator\Rules\QueryComplexity;
  12. /**
  13. * QueryComplexityLimiter
  14. *
  15. * Sets limits for query complexity. A single GraphQL query can potentially
  16. * generate thousands of database operations so, the very complex queries
  17. * should be filtered and rejected.
  18. *
  19. * https://github.com/webonyx/graphql-php/blob/master/docs/security.md#query-complexity-analysis
  20. */
  21. class QueryComplexityLimiter
  22. {
  23. /**
  24. * @var int
  25. */
  26. private $queryDepth;
  27. /**
  28. * @var int
  29. */
  30. private $queryComplexity;
  31. /**
  32. * @var IntrospectionConfiguration
  33. */
  34. private $introspectionConfig;
  35. /**
  36. * @param int $queryDepth
  37. * @param int $queryComplexity
  38. * @param IntrospectionConfiguration $introspectionConfig
  39. */
  40. public function __construct(
  41. int $queryDepth,
  42. int $queryComplexity,
  43. IntrospectionConfiguration $introspectionConfig
  44. ) {
  45. $this->queryDepth = $queryDepth;
  46. $this->queryComplexity = $queryComplexity;
  47. $this->introspectionConfig = $introspectionConfig;
  48. }
  49. /**
  50. * Sets limits for query complexity
  51. *
  52. * @return void
  53. */
  54. public function execute(): void
  55. {
  56. DocumentValidator::addRule(new QueryComplexity($this->queryComplexity));
  57. DocumentValidator::addRule(
  58. new DisableIntrospection((int) $this->introspectionConfig->isIntrospectionDisabled())
  59. );
  60. DocumentValidator::addRule(new QueryDepth($this->queryDepth));
  61. }
  62. }