Use the RateLimiter in SvelteKit
mainImport RateLimiter from sveltekit-rate-limiter/server to protect your +page.server.ts, +server.ts, or src/hooks.server.ts.
You can define built-in limiters like IP, IPUA (IP + User Agent), or cookie. The cookie limiter requires a name and a secret. If preflight is set to true for a cookie limiter, you must call limiter.cookieLimiter?.preflight(event) in your load function to prevent direct POST requests from being automatically limited.
To check and increment the limit, use limiter.isLimited(event) or limiter.check(event) (which provides more detail about the reason for limiting).
import { error } from '@sveltejs/kit';
import { RateLimiter } from 'sveltekit-rate-limiter/server';
const limiter = new RateLimiter({
IP: [10, 'h'],
IPUA: [5, 'm'],
cookie: {
name: 'limiterid',
secret: 'SECRETKEY-SERVER-ONLY',
rate: [2, 'm'],
preflight: true
}
});
export const load = async (event) => {
// Required if cookie preflight is true
await limiter.cookieLimiter?.preflight(event);
};
export const actions = {
default: async (event) => {
if (await limiter.isLimited(event)) throw error(429);
},
debug: async (event) => {
const status = await limiter.check(event);
if (status.limited) {
// status.reason can be 'IP' | 'IPUA' | 'cookie' | number
console.log('Limited due to ' + status.reason);
throw error(429);
}
}
};