So überprüfen Sie die Abfragetiefe und -komplexität in Laravel Lighthouse
<p>Bevor ich Lighthouse auf einem Produktionsserver bereitstelle, überprüfe ich die Sicherheit (https://www.howtographql.com/advanced/4-security/). Deshalb habe ich beschlossen, die Abfragetiefe und die Abfragekomplexität zu überprüfen. </p>
<p>In der Lighthouse-Dokumentation wird <code>config/lighthouse.php</code> erwähnt. </p>
<pre class="brush:php;toolbar:false;">/*
|------------------------------------------------- ---------
|. Sicherheit
|------------------------------------------------- ---------
|
|. Kontrollieren Sie Lighthouse, um die sicherheitsrelevante Abfrageüberprüfung durchzuführen.
|. Ausführliche Lektüre: https://webonyx.github.io/graphql-php/security/
|
*/
'Sicherheit' =>
'max_query_complexity' => GraphQLValidatorRulesQueryComplexity::DISABLED,
'max_query_length' => GraphQLValidatorRulesQueryDepth::DISABLED,
'disable_introspection' => GraphQLValidatorRulesDisableIntrospection::DISABLED,
],
</pre>
<p>Und es wird empfohlen, https://webonyx.github.io/graphql-php/security/ zu lesen. </p>
<p>In diesem Link geben sie einige Beispiele: </p>
<pre class="brush:php;toolbar:false;">verwende GraphQLGraphQL;
verwenden Sie GraphQLValidatorRulesQueryComplexity;
verwenden Sie GraphQLValidatorDocumentValidator;
$rule = new QueryComplexity($maxQueryComplexity = 100);
DocumentValidator::addRule($rule);
GraphQL::executeQuery(/*...*/);
</pre>
<pre class="brush:php;toolbar:false;">verwende GraphQLGraphQL;
verwenden Sie GraphQLValidatorRulesQueryDepth;
verwenden Sie GraphQLValidatorDocumentValidator;
$rule = new QueryDepth($maxDepth = 10);
DocumentValidator::addRule($rule);
GraphQL::executeQuery(/*...*/);
</pre>
<p>Aber wie wendet man diese im Leuchtturm an? </p>
<p>Zuerst habe ich diesen Code in <code>ExampleQuery.php(php artisan lighthouse:query exampleQuery)</code> geschrieben. </p>
<pre class="brush:php;toolbar:false;">finale Klasse exampleQuery
{
öffentliche Funktion __invoke(_, Array $args)
{
$rule = new QueryComplexity(2);
DocumentValidator::addRule($rule);
$rule2 = new QueryDepth(2);
DocumentValidator::addRule($rule2);
zurückkehren [
...
];
}
}
</pre>
<p>Aber das wird keine Probleme verursachen.</p>
<p>Ich glaube, Lighthouse wurde in <code>vendor/nuwave/.../GraphQLController.php</code> gestartet, sodass ich <code>GraphQL::executeQuery(/*...*) nicht ausführen kann. / );</code></p>
Die <p><code>@complexity</code>-Direktive funktioniert auch nicht, <code>@complexity(resolver: "App\Security\ComplexityAnalyzer@userPosts")</code> userPosts-Funktion. </p>
<pre class="brush:php;toolbar:false;">class ComplexityAnalyzer {
öffentliche Funktion userPosts(int $childrenComplexity, array $args): int // nicht aufgerufen
{
$postComplexity = $args['includeFullText']
? 3
: 2;
Log::Debug($postComplexity); // nicht aufgerufen
return $childrenComplexity * $postComplexity;
}
}
</pre>
<p>Was habe ich verpasst? Bitte hilf mir, gut zu schlafen. </p>