fix(security): Rate-Limits je Besucher statt je Cloudflare-Edge
Docker Image bauen und veroeffentlichen / build-and-push (push) Canceled after 0s
Docker Image bauen und veroeffentlichen / build-and-push (push) Canceled after 0s
wabenhain.com laeuft ueber Cloudflare. Der letzte X-Forwarded-For-Eintrag ist dann die Cloudflare-Edge, die sich viele Besucher teilen: Login-, 2FA- und Checkout-Limits trafen alle Besucher derselben Edge gemeinsam, ein einzelner konnte andere aussperren. resolveClientIp nimmt CF-Connecting-IP, wenn die Gegenstelle eine Cloudflare-Edge ist; sonst wie bisher den letzten Eintrag (beim Direktzugriff ist CF-Connecting-IP faelschbar und zaehlt nicht). Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
This commit is contained in:
1 parent
dfa5c97491
commit
946745c064
2 files changed
+58
-6
No files matched your search
@@ -0,0 +1,25 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { resolveClientIp } from "./rate-limit";
|
||||
|
||||
const h = (values: Record<string, string>) => new Headers(values);
|
||||
|
||||
describe("resolveClientIp (Client-IP hinter Cloudflare und Traefik)", () => {
|
||||
it("nimmt den letzten X-Forwarded-For-Eintrag, nie einen vom Client gesetzten", () => {
|
||||
expect(resolveClientIp(h({ "x-forwarded-for": "1.2.3.4, 198.51.100.9" }))).toBe("198.51.100.9");
|
||||
});
|
||||
|
||||
it("nimmt CF-Connecting-IP, wenn die Gegenstelle eine Cloudflare-Edge ist", () => {
|
||||
const viaCloudflare = { "x-forwarded-for": "1.2.3.4, 203.0.113.7, 172.70.1.2", "cf-connecting-ip": "203.0.113.7" };
|
||||
expect(resolveClientIp(h(viaCloudflare))).toBe("203.0.113.7");
|
||||
expect(resolveClientIp(h({ "x-forwarded-for": "2606:4700:10::1", "cf-connecting-ip": "2001:db8::5" }))).toBe("2001:db8::5");
|
||||
});
|
||||
|
||||
it("ignoriert CF-Connecting-IP bei direktem Zugriff an Cloudflare vorbei", () => {
|
||||
expect(resolveClientIp(h({ "x-forwarded-for": "198.51.100.9", "cf-connecting-ip": "203.0.113.7" }))).toBe("198.51.100.9");
|
||||
});
|
||||
|
||||
it("fällt ohne X-Forwarded-For auf X-Real-IP zurück, sonst „unknown“", () => {
|
||||
expect(resolveClientIp(h({ "x-real-ip": "198.51.100.9" }))).toBe("198.51.100.9");
|
||||
expect(resolveClientIp(h({}))).toBe("unknown");
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user