ホームページ  >  に質問  >  本文

Laravel Lighthouse でクエリの深さと複雑さをチェックする方法

<p>Lighthouse を運用サーバーにデプロイする前に、セキュリティをチェックします (https://www.howtographql.com/advanced/4-security/)。そこで、クエリの深さとクエリの複雑さを確認することにしました。 </p> <p>Lighthouse のドキュメントでは、<code>config/lighthouse.php</code> について言及しています。 </p> <pre class="brush:php;toolbar:false;">/* |------------------------------------------------- ----------------------- | セキュリティ |------------------------------------------------- ----------------------- | | Lighthouse を制御して、セキュリティ関連のクエリ検証を処理します。 | 詳細な資料: https://webonyx.github.io/graphql-php/security/ | */ 'セキュリティ' => [ 'max_query_complexity' => \GraphQL\Validator\Rules\QueryComplexity::DISABLED, 'max_query_ Depth' => \GraphQL\Validator\Rules\QueryDepth::DISABLED, 'disable_introspection' => \GraphQL\Validator\Rules\DisableIntrospection::DISABLED, ]、 </pre> <p>そして、https://webonyx.github.io/graphql-php/security/ を読むことをお勧めします。 </p> <p>このリンクでは、いくつかの例が示されています。</p> <pre class="brush:php;toolbar:false;">GraphQL\GraphQL を使用します。 GraphQL\Validator\Rules\QueryComplexity を使用します。 GraphQL\Validator\DocumentValidator を使用します。 $rule = 新しい QueryComplexity($maxQueryComplexity = 100); DocumentValidator::addRule($rule); GraphQL::executeQuery(/*...*/); </pre> <pre class="brush:php;toolbar:false;">GraphQL\GraphQL を使用します。 GraphQL\Validator\Rules\QueryDepth を使用します。 GraphQL\Validator\DocumentValidator を使用します。 $rule = 新しいQueryDepth($maxDepth = 10); DocumentValidator::addRule($rule); GraphQL::executeQuery(/*...*/); </pre> <p>しかし、これらを灯台に適用するにはどうすればよいでしょうか? </p> <p>まず、このコードを <code>ExampleQuery.php(phpArtisan lighthouse:query ExampleQuery)</code> に書き込みました。 </p> <pre class="brush:php;toolbar:false;">最終クラス ExampleQuery { パブリック関数 __invoke(_, 配列 $args) { $rule = 新しい QueryComplexity(2); DocumentValidator::addRule($rule); $rule2 = 新しいクエリ深度(2); DocumentValidator::addRule($rule2); 戻る [ ... ]; } } </pre> <p>しかし、これでは問題は発生しません。</p> <p>Lighthouse は <code>vendor/nuwave/.../GraphQLController.php</code> で開始されていると思うので、<code>GraphQL::executeQuery(/*...*/ ) を実行できません;</code></p> <p><code>@complexity</code> ディレクティブも機能しません。<code>@complexity(resolver: "App\\Security\\ComplexityAnalyzer@userPosts")</code> も機能しません。 userPosts関数と呼ばれます。 </p> <pre class="brush:php;toolbar:false;">class ComplexityAnalyzer { public function userPosts(int $childrenComplexity, array $args): int // 呼び出されません { $postComplexity = $args['includeFullText'] ?3 :2; \Log::Debug($postComplexity); // 呼び出されません $childrenComplexity * $postComplexity を返します。 } } </pre> <p>何を見逃したのですか?よく眠れるようにしてください。 </p>
P粉419164700P粉419164700440日前599

全員に返信(1)返信します

  • P粉717595985

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

    すでに実装されているので、値を設定するだけです。

    リーリー

    複雑性スコアの計算は、@complexity ディレクティブを使用してフィールドごとに変更できます。

    返事
    0
  • キャンセル返事