Cara menyemak kedalaman dan kerumitan pertanyaan dalam Rumah Api Laravel
P粉419164700
2023-08-28 21:26:41
<p>Sebelum menggunakan rumah api ke pelayan pengeluaran, saya menyemak keselamatan (https://www.howtographql.com/advanced/4-security/). Jadi saya memutuskan untuk menyemak kedalaman pertanyaan dan kerumitan pertanyaan. </p>
<p>Dalam dokumentasi rumah api, mereka menyebut <code>config/lighthouse.php</code>. </p>
<pre class="brush:php;toolbar:false;">/*
|------------------------------------------------ -----------------------
|
|------------------------------------------------ -----------------------
|
|. Control Lighthouse untuk mengendalikan pengesahan pertanyaan berkaitan keselamatan.
|. Bacaan terperinci: https://webonyx.github.io/graphql-php/security/
|
*/
'keselamatan' =>
'max_query_complexity' =>
'max_query_depth' => GraphQLValidatorRulesQueryDepth::DISABLED
'disable_introspection' => GraphQLValidatorRulesDisableIntrospection::DISABLED,
],
</pra>
<p>Dan adalah disyorkan untuk membaca https://webonyx.github.io/graphql-php/security/. </p>
<p>Dalam pautan ini mereka memberikan beberapa contoh: </p>
<pre class="brush:php;toolbar:false;">gunakan GraphQLGraphQL;
gunakan GraphQLValidatorRulesQueryComplexity;
gunakan GraphQLValidatorDocumentValidator;
$rule = new QueryComplexity($maxQueryComplexity = 100);
DocumentValidator::addRule($rule);
GraphQL::executeQuery(/*...*/);
</pra>
<pre class="brush:php;toolbar:false;">gunakan GraphQLGraphQL;
gunakan GraphQLValidatorRulesQueryDepth;
gunakan GraphQLValidatorDocumentValidator;
$rule = new QueryDepth($maxDepth = 10);
DocumentValidator::addRule($rule);
GraphQL::executeQuery(/*...*/);
</pra>
<p>Tetapi bagaimana untuk menggunakan ini dalam rumah api? </p>
<p>Mula-mula, saya menulis kod ini ke dalam <kod>ExampleQuery.php(php artisan lighthouse:query ExampleQuery)</code>. </p>
<pre class="brush:php;toolbar:false;">kelas akhir ContohQuery
{
fungsi awam __invoke(_, array $args)
{
$rule = QueryComplexity(2);
DocumentValidator::addRule($rule);
$rule2 = new QueryDepth(2);
DocumentValidator::addRule($rule2);
kembali [
...
];
}
}
</pra>
<p>Tetapi ini tidak akan menimbulkan sebarang masalah.</p>
<p>Saya rasa rumah api dimulakan dalam <code>vendor/nuwave/.../GraphQLController.php</code> jadi saya tidak dapat melaksanakan <code>GraphQL::executeQuery(/*...* / );</code></p>
Arahan <p><code>@complexity</code> juga tidak berfungsi, <code>@complexity(penyelesai: "App\Security\ComplexityAnalyzer@userPosts")</code> fungsi userPosts. </p>
<pre class="brush:php;toolbar:false;">class ComplexityAnalyzer {
fungsi awam userPosts(int $childrenComplexity, array $args): int // tidak dipanggil
{
$postComplexity = $args['includeFullText']
? 3
: 2;
Log::Debug($postComplexity); // tidak dipanggil
pulangkan $childrenComplexity * $postComplexity;
}
}
</pra>
<p>Apa yang saya terlepas? Tolong bantu saya tidur lena. </p>
Ia sudah dilaksanakan, anda hanya perlu tetapkan nilai.
Pengiraan markah kerumitan boleh diubah suai untuk setiap medan menggunakan arahan @complexity.