Socket
Socket
Sign inDemoInstall

graphql-query-count-limit

Package Overview
Dependencies
1
Maintainers
1
Versions
1
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

    graphql-query-count-limit

A validator for the number of queries per request and root selectors per query.


Version published
Weekly downloads
361
decreased by-51.87%
Maintainers
1
Install size
5.56 kB
Created
Weekly downloads
 

Readme

Source

GraphQL Query Count Limit

Dead-simple defense against grouped GraphQL queries. Limit the number of the queries per request and the number of selections allowed at the root of each query.

Why?

Suppose you have an Album type that has a list of Songs.

{
  album(id: 42) {
    songs {
      title
      artists
    }
  }
}

And perhaps you have a different entry point for a Song and the type allows you to go back up to the Album.

{
  song(id: 1337) {
    title
    album {
      title
    }
  }
}

That opens your server to the possibility of a cyclical query!

query evil {
  album(id: 42) {
    songs {
      album {
        songs {
            # Depth is covered by graphql-depth-limit...
          }
        }
      }
    }
  }
  album(id: 41) {
    songs {
      album {
        songs {
            # but one can add as many selection at the root of the query
          }
        }
      }
    }
  }
  # Creating a single-call-ddos
  ...
}
# Also, most engines handles any number queries per request! Making another possible single-call-ddos possibility.
query evil2 {
  album(id: 42) {
    songs {
      album {
        songs {
            ...
          }
        }
      }
    }
  }
  ...
}

Liming root selections and queries

graphql-query-count-limit will limit the number of queries per request and the number of root selections per query.

Usage

$ npm install graphql-query-count-limit

It works with any library using graphql-server, such as, apollo-server, express-graphql and koa-graphql.

Here is an example with Express.

import queryLimit from 'graphql-query-count-limit'
import express from 'express'
import graphqlHTTP from 'express-graphql'
import schema from './schema'

const app = express()

app.use('/graphql', graphqlHTTP((req, res) => ({
  schema,
  validationRules: [ queryLimit(10) ]
})))

The first argument is the maximum number of queries in a single request. This will throw a validation error if more than the allowed amount if queries are specified.
The second, optional, argument is the maximum amount of root selections on any query

queryLimit(
  3,
  5
)

References

This library is made thanks to the awesome graphql-depth-limit library that you should always install with graphql-query-count-limit as they are both needed for a better DDOS protection.

Also, once those two librairies are installed, you will still have to make sure that:

  • Limits/offset are enforced on all "list" endpoints
  • You have a rate limit system put in place

Keywords

FAQs

Last updated on 13 Jul 2020

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.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc