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;">/*
|------------------------------------------------- -------------
보안 |
|------------------------------------------------- -------------
|
| 보안 관련 쿼리 검증을 처리하는 Control Lighthouse입니다.
| 자세한 내용은 https://webonyx.github.io/graphql-php/security/
|
*/
'보안' =>
'max_query_complexity' => GraphQLValidatorRulesQueryComplexity::DISABLED,
'max_query_length' => GraphQLValidatorRulesQueryDepth::DISABLED,
'disable_introspection' => GraphQLValidatorRulesDisableIntrospection::DISABLED,
],
</pre>
<p>그리고 https://webonyx.github.io/graphql-php/security/를 읽어보는 것이 좋습니다. </p>
<p>이 링크에는 몇 가지 예가 나와 있습니다. </p>
<pre class="brush:php;toolbar:false;">GraphQLGraphQL을 사용하세요.
GraphQLValidatorRulesQueryComplexity를 사용하세요.
GraphQLValidatorDocumentValidator를 사용하세요.
$rule = new QueryComplexity($maxQueryComplexity = 100);
DocumentValidator::addRule($rule);
GraphQL::executeQuery(/*...*/);
</pre>
<pre class="brush:php;toolbar:false;">GraphQLGraphQL을 사용하세요.
GraphQLValidatorRulesQueryDepth를 사용하세요.
GraphQLValidatorDocumentValidator를 사용하세요.
$rule = new QueryDepth($maxDepth = 10);
DocumentValidator::addRule($rule);
GraphQL::executeQuery(/*...*/);
</pre>
<p>그런데 이것을 등대에 어떻게 적용할까요? </p>
<p>먼저 이 코드를 <code>ExampleQuery.php(php artisan lighthouse:queryExampleQuery)</code>에 작성했습니다. </p>
<pre class="brush:php;toolbar:false;">최종 클래스 예제쿼리
{
공개 함수 __invoke(_, 배열 $args)
{
$rule = 새로운 쿼리복잡성(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;">클래스 ComplexityAnalyzer {
공용 함수 userPosts(int $childrenComplexity, array $args): int // 호출되지 않음
{
$postComplexity = $args['includeFullText']
? 삼
: 2;
Log::Debug($postComplexity); // 호출되지 않음
$childrenComplexity * $postComplexity를 반환합니다.
}
}
</pre>
<p>내가 무엇을 놓쳤나요? 잘 자도록 도와주세요. </p>