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>