fix(security): eigene Rate-Limits zaehlen IPv6 je /64-Netz
Docker-Images bauen und veroeffentlichen / build-and-push (push) Successful in 7m24s
Docker-Images bauen und veroeffentlichen / build-and-push (push) Successful in 7m24s
consumeRateLimit bekommt IPv6-Adressen als /64-Praefix (rateLimitSubject): ein Anschluss hat meist ein ganzes /64 und koennte sonst durch Adresswechsel jedes Limit umgehen. better-auth bekommt weiter die einzelne Adresse und normalisiert sie selbst auf /64 (ipv6Subnet, Standard 64). Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
This commit is contained in:
1 parent
f75a5f7769
commit
e6fa383934
3 files changed
+47
-3
No files matched your search
+14
-1
@@ -1,5 +1,5 @@
|
||||
import { describe, expect, test } from "vitest";
|
||||
import { CLIENT_IP_HEADER, clientIp, withClientIp } from "@/lib/rate-limit";
|
||||
import { CLIENT_IP_HEADER, clientIp, rateLimitSubject, withClientIp } from "@/lib/rate-limit";
|
||||
|
||||
const h = (values: Record<string, string>) => new Headers(values);
|
||||
|
||||
@@ -20,6 +20,19 @@ describe("clientIp hinter Traefik", () => {
|
||||
expect(clientIp(h({ "x-forwarded-for": "1.2.3.4, kein-ip" }))).toBe("unknown");
|
||||
});
|
||||
|
||||
test("Rate-Limits zählen IPv6 je /64-Netz, IPv4-gemappte Adressen wie IPv4", () => {
|
||||
expect(rateLimitSubject(clientIp(h({ "x-forwarded-for": "2001:db8:1:2:aaaa::1" })))).toBe("2001:db8:1:2::/64");
|
||||
expect(rateLimitSubject("2001:0DB8:0001:0002:ffff:ffff:ffff:ffff")).toBe("2001:db8:1:2::/64");
|
||||
expect(rateLimitSubject("2001:db8:1:3::1")).not.toBe(rateLimitSubject("2001:db8:1:2::1"));
|
||||
expect(rateLimitSubject("::ffff:198.51.100.9")).toBe("198.51.100.9");
|
||||
expect(rateLimitSubject("198.51.100.9")).toBe("198.51.100.9");
|
||||
});
|
||||
|
||||
test("better-auth bekommt eine einzelne gültige IP (es normalisiert IPv6 selbst auf /64)", () => {
|
||||
const request = new Request("https://example.org/api/auth/sign-in/email", { headers: { "x-forwarded-for": "2001:db8:1:2:aaaa::1" } });
|
||||
expect(withClientIp(request).headers.get(CLIENT_IP_HEADER)).toBe("2001:db8:1:2:aaaa::1");
|
||||
});
|
||||
|
||||
test("withClientIp setzt den Header für better-auth und überschreibt einen mitgeschickten Wert", () => {
|
||||
const request = new Request("https://example.org/api/auth/sign-in/email", {
|
||||
method: "POST",
|
||||
|
||||
Reference in new issue
Block a user