Skip to content

Commit a2a6639

Browse files
aster-voidclaude
andcommitted
modules/site: add rate limiting for redirect DB lookups
Prevent DoS attacks on legacy URL redirect DB lookups: - Global 1 request per second limit - Returns 429 Too Many Requests when exceeded 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <[email protected]>
1 parent 33a43e1 commit a2a6639

File tree

1 file changed

+12
-1
lines changed

1 file changed

+12
-1
lines changed

src/hooks.server.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { Handle } from "@sveltejs/kit";
2-
import { redirect } from "@sveltejs/kit";
2+
import { error, redirect } from "@sveltejs/kit";
33
import { sequence } from "@sveltejs/kit/hooks";
44
import { svelteKitHandler } from "better-auth/svelte-kit";
55
import { like } from "drizzle-orm";
@@ -12,6 +12,9 @@ const handleAuth: Handle = async ({ event, resolve }) => {
1212
return await svelteKitHandler({ event, resolve, auth, building });
1313
};
1414

15+
// Global rate limiter for DB lookup redirects (1 request per second)
16+
let lastDbLookup = 0;
17+
1518
const handleRedirect: Handle = async ({ event, resolve }) => {
1619
const path = event.url.pathname;
1720

@@ -33,6 +36,14 @@ const handleRedirect: Handle = async ({ event, resolve }) => {
3336
if (/^\d{4}-\d{2}-\d{2}-/.test(oldSlug)) {
3437
return resolve(event);
3538
}
39+
40+
// Global rate limit: 1 DB lookup per second
41+
const now = Date.now();
42+
if (now - lastDbLookup < 1000) {
43+
error(429, "Too many requests");
44+
}
45+
lastDbLookup = now;
46+
3647
// DB lookup: find article where slug ends with the old slug pattern
3748
const found = await db
3849
.select({ slug: article.slug })

0 commit comments

Comments
 (0)