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>