hapi-multi-rate-limit v2.1.5
hapi-multi-rate-limit
Lead Maintainer: DomenicoPizzata
Introduction
hapi-multi-rate-limit is a plugin for hapi that enables rate limiting.
It relies on cache being defined in the server.
It allows different options for user-path configuration in terms of time (seconds, minutes, hours, days).
Use
const Hapi = require('hapi');
const server = Hapi.server({
cache: { engine: require('catbox-memory'), name: 'memory' }
});
server.register({
plugin: require('hapi-multi-rate-limit'),
options: {}
});Options
Defaults are given here
enabled:truewhether or not rate limiting is enabled at all. Set this tofalsein a route's config to bypass all rate limiting for that routeuserLimit:300number of total requests a user can make per period. Set tofalseto disable limiting requests per user.userCache: Object with the following properties:segment:hapi-multi-rate-limit-userName of the cache segment to use for storing user rate limit infoexpiresIn:600000Time (in milliseconds) of period foruserLimit
userAttribute:idcredentials attribute to use when determining distinct authenticated usersuserWhitelist:[]array of users (as defined byuserAttributefor whom to bypass rate limiting. This is only applied to authenticated users, for ip whitelisting useipWhitelist.addressOnly:falseif true, only consider user address when determining distinct authenticated userspathLimit:50number of total requests that can be made on a given path per period. Set tofalseto disable limiting requests per path.pathCache: Object with the following properties: -segment:hapi-multi-rate-limit-pathName of the cache segment to use for storing path rate limit info -expiresIn:60000Time (in milliseconds) of period forpathLimituserPathLimitSeconds:falsenumber of total requests that can be made on a given path per user per period (seconds). Set tofalseto disable limiting requests per path per user.userPathLimitMinutes:falsenumber of total requests that can be made on a given path per user per period (minutes). Set tofalseto disable limiting requests per path per user.userPathLimitHours:falsenumber of total requests that can be made on a given path per user per period (hours). Set tofalseto disable limiting requests per path per user.userPathLimitDays:falsenumber of total requests that can be made on a given path per user per period (days). Set tofalseto disable limiting requests per path per user.userPathCacheSeconds: Object with the following properties: -segment:hapi-multi-rate-limit-userPathSecondsName of the cache segment to use for storing userPath rate limit info -expiresIn:1000Time (in milliseconds) of period foruserPathLimitSecondsuserPathCacheMinutes: Object with the following properties: -segment:hapi-multi-rate-limit-userPathMinutesName of the cache segment to use for storing userPath rate limit info -expiresIn:60000Time (in milliseconds) of period foruserPathLimitMinutesuserPathCacheHours: Object with the following properties: -segment:hapi-multi-rate-limit-userPathHoursName of the cache segment to use for storing userPath rate limit info -expiresIn:3600000Time (in milliseconds) of period foruserPathLimitHoursuserPathCacheDays: Object with the following properties: -segment:hapi-multi-rate-limit-userPathDaysName of the cache segment to use for storing userPath rate limit info -expiresIn:86400000Time (in milliseconds) of period foruserPathLimitDaysheaders:trueWhether or not to include headers in responsesipWhitelist:[]array of IPs for whom to bypass rate limiting. Note that a whitelisted IP would also bypass restrictions an authenticated user would otherwise have.trustProxy:falseIf true, honor theX-Forwarded-Forheader. See note below.getIpFromProxyHeader:undefineda function which will extract the remote address from theX-Forwarded-Forheader. The default implementation takes the first entry.
Users
A user is considered a single remoteAddress for routes that are unauthenticated. On authenticated routes it is the userAtribute (default id) of the authenticated user.
If trustProxy is true, the address from the X-Forwarded-For header will be use instead of remoteAddress, if present.
If trustProxy is true and getIpFromProxyHeader is not defined, the address will be determined using the first entry in the X-Forwarded-For header.
Proxies
If you set trustProxy to true, make sure that your proxy server is the only thing that can access the server, and be sure to configure your proxy to strip all incoming X-Forwarded-For headers.
For example if you were using haproxy you would add reqidel ^X-Forwarded-For to your config.
Failure to do this would allow anyone to spoof that header to bypass your rate limiting.
Response Headers
The following headers will be included in server responses if their respective limits are enabled
x-ratelimit-pathlimit: Will equalpathLimitx-ratelimit-pathremaining: Remaining number of requests path has this - periodx-ratelimit-pathreset: Time (in milliseconds) until reset ofpathLimitperiodx-ratelimit-userlimit: Will equaluserLimitx-ratelimit-userremaining: Remaining number of requests user has this periodx-ratelimit-userreset: Time (in milliseconds) until reset ofuserLimitperiodx-ratelimit-userpathlimit-seconds: Will equaluserPathLimitSecondsx-ratelimit-userpathremaining-seconds: Remaining number of requests user has this period for this pathx-ratelimit-userpathreset-seconds: Time (in milliseconds) until reset ofuserPathLimitSecondsperiodx-ratelimit-userpathlimit-minutes: Will equaluserPathLimitMinutesx-ratelimit-userpathremaining-minutes: Remaining number of requests user has this period for this pathx-ratelimit-userpathreset-minutes: Time (in milliseconds) until reset ofuserPathLimitMinutesperiodx-ratelimit-userpathlimit-hours: Will equaluserPathLimitHoursx-ratelimit-userpathremaining-hours: Remaining number of requests user has this period for this pathx-ratelimit-userpathreset-hours: Time (in milliseconds) until reset ofuserPathLimitHoursperiodx-ratelimit-userpathlimit-days: Will equaluserPathLimitDaysx-ratelimit-userpathremaining-days: Remaining number of requests user has this period for this pathx-ratelimit-userpathreset-days: Time (in milliseconds) until reset ofuserPathLimitDaysperiod
Per-route settings
All of the settings (except for userLimit and userCache) can be overridden in your route's config.
For instance, to disable pathLimit for a route you would add this to its config attribute
plugins: {
'hapi-multi-rate-limit': {
pathLimit: false
}
}To disable all rate limiting for a route you woul add this to its config attribute
plugins: {
'hapi-multi-rate-limit': {
enabled: false
}
}License: MIT