GraphQL Armor Max-Depth Plugin Bypass via fragment caching
### Summary
A query depth restriction using the max-depth can be bypassed if `ignoreIntrospection` is enabled (which is the default configuration) by naming your query/fragment `__schema`.
### Details
In the `countDepth` function, we have the following code that calculates the depth of a used fragment:
```typescript
} else if (node.kind == Kind.FRAGMENT_SPREAD) {
if (this.visitedFragments.has(node.name.value)) {
return this.visitedFragments.get(node.name.value) ?? 0;
} else {
this.visitedFragments.set(node.name.value, -1);
}
const fragment = this.context.getFragment(node.name.value);
if (fra
GraphQL Armor Max-Depth Plugin Bypass via Introspection Query Obfuscation
### Summary
A query depth restriction using the `max-depth` property can be bypassed if `ignoreIntrospection` is enabled (which is the default configuration) by naming your query/fragment `__schema`.
### Details
At the start of the `countDepth` function, we have the following check for the `ignoreIntrospection` option:
```typescript
if (this.config.ignoreIntrospection && 'name' in node && node.name?.value === '__schema') {
return 0;
}
```
However, the `node` can be one of: `FieldNode`, `FragmentDefinitionNode`, `InlineFragmentNode`, `OperationDefinitionNode`, `FragmentSpreadNode`.
For example, consider sending the followin