
Security News
PEP 810 Proposes Explicit Lazy Imports for Python 3.15
An opt-in lazy import keyword aims to speed up Python startups, especially CLIs, without the ecosystem-wide risks that sank PEP 690.
@escape.tech/graphql-armor
Advanced tools
Dead-simple, yet highly customizable security middleware for Apollo GraphQL servers shield
GraphQL Armor is a dead-simple yet highly customizable security middleware for various GraphQL server engines.
We support the following engines :
We additionally support the following engines through the Envelop plugin system :
See here for more information about Envelop compatibility.
# npm
npm install -S @escape.tech/graphql-armor
# yarn
yarn add @escape.tech/graphql-armor
Refer to the Examples directory for specific implementation examples. (such as NestJS with Apollo Server)
import { ApolloArmor } from '@escape.tech/graphql-armor';
const armor = new ApolloArmor();
const server = new ApolloServer({
typeDefs,
resolvers,
...armor.protect()
});
If you already have some plugins or validation rules, proceed this way:
import { ApolloArmor } from '@escape.tech/graphql-armor';
const armor = new ApolloArmor();
const protection = armor.protect()
const server = new ApolloServer({
typeDefs,
resolvers,
...protection,
plugins: [...protection.plugins, myPlugin1, myPlugin2 ]
validationRules: [, ...protection.validationRules, myRule1, myRule2 ]
});
import { EnvelopArmor } from '@escape.tech/graphql-armor';
const armor = new EnvelopArmor();
const protection = armor.protect()
async function main() {
const server = createServer({
schema,
plugins: [...protection.plugins],
});
await server.start();
}
main();
import { EnvelopArmorPlugin } from '@escape.tech/graphql-armor';
async function main() {
const server = createServer({
schema,
plugins: [EnvelopArmorPlugin()],
});
await server.start();
}
main();
import { EnvelopArmor } from '@escape.tech/graphql-armor';
const armor = new EnvelopArmor();
const protection = armor.protect()
const getEnveloped = envelop({
plugins: [otherPlugins, ...protection.plugins],
});
import { EnvelopArmorPlugin } from '@escape.tech/graphql-armor';
const getEnveloped = envelop({
plugins: [otherPlugins, EnvelopArmorPlugin()],
});
GraphQL Armor is fully configurable in a per-plugin fashion.
View the per plugin configuration section for more information about how to configure each plugin separately.
import { ApolloArmor } from '@escape.tech/graphql-armor';
const armor = new ApolloArmor({
costLimit: {
maxCost: 1000,
}
}
});
The provided values are the default values.
This section describes how to configure each plugin individually.
This plugin is for Apollo Server only, and is disabled by default.
Stacktraces are managed by the Apollo configuration parameter includeStacktraceInErrorResponses
. GraphQL Armor set this default value to false
too.
For overriding Apollo's default parameter, you can use the following code:
import { ApolloArmor } from '@escape.tech/graphql-armor';
const armor = new ApolloArmor();
const server = new ApolloServer({
typeDefs,
resolvers,
...armor.protect(),
includeStacktraceInErrorResponses: true,
});
In Apollo Server 3, this is enabled by default. For overriding Apollo's default parameter, you can use the following code:
import { ApolloArmor } from '@escape.tech/graphql-armor';
const armor = new ApolloArmor();
const server = new ApolloServer({
typeDefs,
resolvers,
...armor.protect(),
debug: false,
});
This plugin is for Apollo Server only, and is disabled by default.
Batched queries are managed by the Apollo configuration parameter allowBatchedHttpRequests
. GraphQL Armor set this default value to false
too.
For overriding Apollo's default parameter, you can use the following code:
import { ApolloArmor } from '@escape.tech/graphql-armor';
const armor = new ApolloArmor();
const server = new ApolloServer({
typeDefs,
resolvers,
...armor.protect(),
allowBatchedHttpRequests: true // setting the value to `true` makes DoS attacks easier by stacking expensive requests
});
In Apollo Server 3, this is enabled by default. For overriding Apollo's default parameter, you can use the following code:
import { ApolloArmor } from '@escape.tech/graphql-armor';
const armor = new ApolloArmor();
const server = new ApolloServer({
typeDefs,
resolvers,
...armor.protect(),
allowBatchedHttpRequests: false // setting the value to `false` is recommended to prevent stacking expensive requests
});
This plugin is disabled by default.
It enforces a character limit on your GraphQL queries.
The limit is not applied to the whole HTTP body - multipart form data/file upload will still work.
For configuration details, refer to this README.
```typescript
{ characterLimit: { enabled: true, maxLength: 15000, } }
### Cost Limit
This plugin is enabled by default.
It analyzes incoming GraphQL queries and applies a cost analysis algorithm to prevent resource overload by blocking too expensive requests (DoS attack attempts).
The cost computation is quite simple (and naive) at the moment but there are plans to make it evolve toward a extensive plugin with many features.
Configuration
```typescript
{
costLimit: {
// enabled: true,
maxCost: 5000, // maximum cost of a request before it is rejected
objectCost: 2, // cost of retrieving an object
scalarCost: 1, // cost of retrieving a scalar
depthCostFactor: 1.5, // multiplicative cost of depth
ignoreIntrospection: true, // by default, introspection queries are ignored.
onAccept: [], // Callbacks that are ran whenever a Query is accepted
onReject: [], // Callbacks that are ran whenever a Query is rejected
propagateOnRejection: true, // When rejected, do you want to throw the error or report to the context?
}
}
This plugin is enabled by default.
It will prevent suggesting fields in case of an erroneous request. Suggestions can lead to the leak of your schema even with disabled introspection, which can be very detrimental in case of a private API. One could use GraphDNA to recover an API schema even with disabled introspection, as long as field suggestions are enabled.
Example of such a suggestion:
Cannot query field "sta" on type "Media". Did you mean "stats", "staff", or "status"?
{
blockFieldSuggestion: {
// enabled: true,
}
}
This plugin is enabled by default.
Limit the number of aliases in a document.
{
maxAliases: {
// enabled: true,
n: 15,
onAccept: [], // Callbacks that are ran whenever a Query is accepted
onReject: [], // Callbacks that are ran whenever a Query is rejected
propagateOnRejection: true, // When rejected, do you want to throw the error or report to the context?
}
}
This plugin is enabled by default.
Limit the number of directives in a document.
{
maxDirectives: {
// enabled: true,
n: 50,
onAccept: [], // Callbacks that are ran whenever a Query is accepted
onReject: [], // Callbacks that are ran whenever a Query is rejected
propagateOnRejection: true, // When rejected, do you want to throw the error or report to the context?
}
}
This plugin is enabled by default.
Limit the depth of a document.
{
maxDepth: {
// enabled: true,
n: 6,
onAccept: [], // Callbacks that are ran whenever a Query is accepted
onReject: [], // Callbacks that are ran whenever a Query is rejected
propagateOnRejection: true, // When rejected, do you want to throw the error or report to the context?
}
}
This plugin is enabled by default.
Limit the number of GraphQL tokens in a document.
{
maxTokens: {
// enabled: true,
n: 1000,
onAccept: [], // Callbacks that are ran whenever a Query is accepted
onReject: [], // Callbacks that are ran whenever a Query is rejected
propagateOnRejection: true, // When rejected, do you want to throw the error or do nothing?
}
}
Ensure you have read the Contributing Guide before contributing.
To setup your project, make sure you run the install-dev.sh
script.
git clone git@github.com:Escape-Technologies/graphql-armor.git
cd graphql-armor
bash ./install-dev.sh
We are using yarn as our package manager and the workspaces monorepo setup. Please read the associated documentation and feel free to open issues if you encounter problems when developing on our project!
FAQs
Dead-simple, yet highly customizable security middleware for Apollo GraphQL servers shield
The npm package @escape.tech/graphql-armor receives a total of 136,738 weekly downloads. As such, @escape.tech/graphql-armor popularity was classified as popular.
We found that @escape.tech/graphql-armor demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 4 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
An opt-in lazy import keyword aims to speed up Python startups, especially CLIs, without the ecosystem-wide risks that sank PEP 690.
Security News
Socket CEO Feross Aboukhadijeh discusses the recent npm supply chain attacks on PodRocket, covering novel attack vectors and how developers can protect themselves.
Security News
Maintainers back GitHub’s npm security overhaul but raise concerns about CI/CD workflows, enterprise support, and token management.