Maison  >  Questions et réponses  >  le corps du texte

Comment vérifier la profondeur et la complexité des requêtes dans Laravel Lighthouse

<p>Avant de déployer Lighthouse sur un serveur de production, je vérifie la sécurité (https://www.howtographql.com/advanced/4-security/). J'ai donc décidé de vérifier la profondeur et la complexité des requêtes. </p> <p>Dans la documentation du phare, ils mentionnent <code>config/lighthouse.php</code>. </p> <pre class="brush:php;toolbar:false;">/* |------------------------------------------------- ----------------------- Sécurité | |------------------------------------------------- ----------------------- | | Control Lighthouse pour gérer la vérification des requêtes liées à la sécurité. | Lecture détaillée : https://webonyx.github.io/graphql-php/security/ | */ 'sécurité' => 'max_query_complexity' => GraphQLValidatorRulesQueryComplexity::DISABLED, 'max_query_degree' => GraphQLValidatorRulesQueryDepth :: DISABLED, 'disable_introspection' => GraphQLValidatorRulesDisableIntrospection::DISABLED, ], ≪/pré> <p>Et il est recommandé de lire https://webonyx.github.io/graphql-php/security/. </p> <p>Dans ce lien, ils donnent quelques exemples : </p> <pre class="brush:php;toolbar:false;">utilisez GraphQLGraphQL; utilisez GraphQLValidatorRulesQueryComplexity ; utilisez GraphQLValidatorDocumentValidator ; $rule = new QueryComplexity($maxQueryComplexity = 100); DocumentValidator :: addRule ($ règle); GraphQL::executeQuery(/*...*/); ≪/pré> <pre class="brush:php;toolbar:false;">utilisez GraphQLGraphQL; utilisez GraphQLValidatorRulesQueryDepth ; utilisez GraphQLValidatorDocumentValidator ; $rule = new QueryDepth($maxDepth = 10); DocumentValidator :: addRule ($ règle); GraphQL::executeQuery(/*...*/); ≪/pré> <p>Mais comment les appliquer dans un phare ? </p> <p>Tout d'abord, j'ai écrit ce code dans <code>ExampleQuery.php(php artisan lighthouse:query SampleQuery)</code>. </p> <pre class="brush:php;toolbar:false;">classe finale ExempleRequête { fonction publique __invoke(_, tableau $args) { $rule = nouveau QueryComplexity(2); DocumentValidator :: addRule ($ règle); $rule2 = nouveau QueryDepth(2); DocumentValidator::addRule($rule2); retour [ ... ]; } } ≪/pré> <p>Mais cela ne posera aucun problème.</p> <p>Je pense que Lighthouse est démarré dans <code>vendor/nuwave/.../GraphQLController.php</code> donc je ne peux pas exécuter <code>GraphQL::executeQuery(/*...* / );</code></p> La directive <p><code>@complexity</code> ne fonctionne pas non plus, <code>@complexity(resolver: "App\Security\ComplexityAnalyzer@userPosts")</code> Fonction userPosts. </p> <pre class="brush:php;toolbar:false;">class ComplexityAnalyzer { fonction publique userPosts (int $childrenComplexity, array $args) : int // non appelé { $postComplexity = $args['includeFullText'] ?3 : 2; Log::Debug($postComplexity); // non appelé return $childrenComplexity * $postComplexity; } } ≪/pré> <p>Qu’est-ce que j’ai manqué ? S'il vous plaît, aidez-moi à bien dormir. </p>
P粉419164700P粉419164700390 Il y a quelques jours566

répondre à tous(1)je répondrai

  • P粉717595985

    P粉7175959852023-08-29 14:32:38

    C'est déjà implémenté, il vous suffit de définir la valeur.

    'security' => [
            'max_query_complexity' => 100,
            'max_query_depth' => 10,
        ],

    Le calcul du score de complexité peut être modifié pour chaque champ à l'aide de la directive @complexity.

    répondre
    0
  • Annulerrépondre