次のようなクエリを使用して、Apolloサーバーに対するネストされた攻撃をどのように防ぎますか?
{
authors {
firstName
posts {
title
author {
firstName
posts{
title
author {
firstName
posts {
title
[n author]
[n post]
}
}
}
}
}
}
}
つまり、クエリで送信される再帰の数をどのように制限できますか?これは、潜在的なサーバーの脆弱性である可能性があります。
執筆時点では、GraphQL-JSやApollo Serverにこの懸念を処理する組み込み機能はありませんが、GraphQLの人気が高まるにつれて、シンプルなソリューションが確実に必要になるはずです。この懸念は、スタックのいくつかのレベルでいくつかのアプローチで対処できます。また、常にレート制限と組み合わせて、サーバーに多くのクエリを送信できないようにする必要があります(これはRESTも同様)。
考えられるさまざまな方法をすべてリストし、これらのソリューションがさまざまなGraphQLサーバーに実装されているため、この答えを最新に保つようにします。それらのいくつかは非常に単純であり、いくつかはより複雑です。
(1)と(2)は、特に多くの新しい開発者がこれらの懸念に気付いていない可能性があるため、おそらくすべてのGraphQLサーバーがデフォルトで持つべきものです。 (3)特定の種類のアプリでのみ機能しますが、非常に厳しいパフォーマンスまたはセキュリティ要件がある場合に適しています。
Stubailoの答えのポイント(4)を補うために、着信GraphQLドキュメントにコストと深さの境界を課すNode.js実装がいくつかあります。
これらは、検証フェーズを補足するカスタムルールです。
クエリのホワイトリストのバリエーションはクエリ署名です。
ビルドプロセス中に、各クエリは、サーバーと共有されているがクライアントにはバンドルされていないシークレットを使用して暗号で署名されます。その後、実行時にサーバーはクエリが本物であることを検証できます。
ホワイトリストに勝る利点は、クライアントでクエリを作成するときにサーバーを変更する必要がないことです。これは、複数のクライアントが同じサーバー(Web、デスクトップ、モバイルアプリなど)にアクセスする場合に特に役立ちます。
クエリのコスト制限には、 graphql-cost-analysis を使用できます
これは、クエリを実行する前に解析する検証ルールです。 GraphQLサーバーでは、必要なスキーマタイプマップの各フィールドにコスト構成を割り当てるだけです。
お見逃しなく graphql-rate-limit ????基本的かつきめ細かいレート制限をクエリまたは突然変異に追加するGraphQLディレクティブ。