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.
In der Lighthouse-Dokumentation wird config/lighthouse.php
erwähnt.
/* |------------------------------------------------- --------- |. 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, ],
Und es wird empfohlen, https://webonyx.github.io/graphql-php/security/ zu lesen.
In diesem Link geben sie einige Beispiele:
verwende GraphQLGraphQL; verwenden Sie GraphQLValidatorRulesQueryComplexity; verwenden Sie GraphQLValidatorDocumentValidator; $rule = new QueryComplexity($maxQueryComplexity = 100); DocumentValidator::addRule($rule); GraphQL::executeQuery(/*...*/);
verwende GraphQLGraphQL; verwenden Sie GraphQLValidatorRulesQueryDepth; verwenden Sie GraphQLValidatorDocumentValidator; $rule = new QueryDepth($maxDepth = 10); DocumentValidator::addRule($rule); GraphQL::executeQuery(/*...*/);
Aber wie wendet man diese im Leuchtturm an?
Zuerst habe ich diesen Code in ExampleQuery.php(php artisan lighthouse:query exampleQuery)
geschrieben.
finale Klasse exampleQuery { öffentliche Funktion __invoke(_, Array $args) { $rule = new QueryComplexity(2); DocumentValidator::addRule($rule); $rule2 = new QueryDepth(2); DocumentValidator::addRule($rule2); zurückkehren [ ... ]; } }
Aber das wird keine Probleme verursachen.
Ich glaube, Lighthouse wurde in vendor/nuwave/.../GraphQLController.php
gestartet, sodass ich GraphQL::executeQuery(/*...*) nicht ausführen kann. / );
@complexity
-Direktive funktioniert auch nicht, @complexity(resolver: "App\Security\ComplexityAnalyzer@userPosts")
userPosts-Funktion.
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; } }
Was habe ich verpasst? Bitte hilf mir, gut zu schlafen.
它已经实现了,你只需要设置值。
复杂度分数计算可以使用@complexity指令对每个字段进行修改。