From 839e1bf82fc48deb06e3b834a2c8ffe121223cff Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Mon, 26 Jan 2026 01:49:05 +0000 Subject: [PATCH] feat: add client-side rate limiting to contact form - Added `useRateLimit` hook - Integrated hook into `Contact.tsx` - Added translations for rate limit error - Added unit tests - Fixed type error in `Button.tsx` to allow build to pass --- .jules/sentinel.md | 5 ++ src/components/ui/Button.tsx | 2 +- src/components/ui/__tests__/Button.test.tsx | 1 - src/hooks/index.ts | 1 + src/hooks/useRateLimit.test.ts | 64 ++++++++++++++++++++ src/hooks/useRateLimit.ts | 38 ++++++++++++ src/i18n/de.ts | 1 + src/i18n/en.ts | 1 + src/pages/Contact.tsx | 19 ++++++ verification.png | Bin 0 -> 49643 bytes verification/verify_rate_limit.py | 60 ++++++++++++++++++ 11 files changed, 190 insertions(+), 2 deletions(-) create mode 100644 src/hooks/useRateLimit.test.ts create mode 100644 src/hooks/useRateLimit.ts create mode 100644 verification.png create mode 100644 verification/verify_rate_limit.py diff --git a/.jules/sentinel.md b/.jules/sentinel.md index 48a437e..a98cbd0 100644 --- a/.jules/sentinel.md +++ b/.jules/sentinel.md @@ -2,3 +2,8 @@ **Vulnerability:** The application is served without standard security headers (CSP, X-Frame-Options, etc.), leaving it vulnerable to XSS, Clickjacking, and MIME sniffing. **Learning:** Single Page Applications (SPAs) served via static hosting (like Firebase) rely on infrastructure configuration for security headers, which are often overlooked. Default configurations are rarely secure enough. **Prevention:** Always configure `firebase.json` (or equivalent) with strict security headers (CSP, X-Frame-Options, HSTS, etc.) at project setup. + +## 2026-01-26 - Client-Side Rate Limiting for Serverless Forms +**Vulnerability:** Contact forms using client-side services (like EmailJS) without backend middleware are vulnerable to spam and quota exhaustion. +**Learning:** While true rate limiting requires a backend, client-side throttling via `localStorage` provides a necessary friction layer for legitimate users and simple bots, protecting external service quotas. +**Prevention:** Implement reusable rate-limit hooks for all public-facing form submissions in static/serverless applications. diff --git a/src/components/ui/Button.tsx b/src/components/ui/Button.tsx index a9498d9..43a5144 100644 --- a/src/components/ui/Button.tsx +++ b/src/components/ui/Button.tsx @@ -2,7 +2,7 @@ import { type ReactNode, type ButtonHTMLAttributes } from 'react'; import { motion } from 'motion/react'; import styles from './Button.module.css'; -interface ButtonProps extends ButtonHTMLAttributes { +interface ButtonProps extends Omit, 'onAnimationStart' | 'onDragStart' | 'onDragEnd' | 'onDrag'> { variant?: 'primary' | 'secondary' | 'outline'; size?: 'sm' | 'md' | 'lg'; children: ReactNode; diff --git a/src/components/ui/__tests__/Button.test.tsx b/src/components/ui/__tests__/Button.test.tsx index d97e8a2..3fa3714 100644 --- a/src/components/ui/__tests__/Button.test.tsx +++ b/src/components/ui/__tests__/Button.test.tsx @@ -2,7 +2,6 @@ import { render, screen, cleanup } from '@testing-library/react'; import { describe, it, expect, afterEach } from 'vitest'; import { Button } from '../Button'; -import React from 'react'; describe('Button', () => { afterEach(() => { diff --git a/src/hooks/index.ts b/src/hooks/index.ts index 2352175..a9b16e0 100644 --- a/src/hooks/index.ts +++ b/src/hooks/index.ts @@ -1 +1,2 @@ export { useTypingEffect } from './useTypingEffect'; +export { useRateLimit } from './useRateLimit'; diff --git a/src/hooks/useRateLimit.test.ts b/src/hooks/useRateLimit.test.ts new file mode 100644 index 0000000..ea75f2c --- /dev/null +++ b/src/hooks/useRateLimit.test.ts @@ -0,0 +1,64 @@ +// @vitest-environment jsdom +import { renderHook, act } from '@testing-library/react'; +import { describe, it, expect, beforeEach, vi, afterEach } from 'vitest'; +import { useRateLimit } from './useRateLimit'; + +describe('useRateLimit', () => { + beforeEach(() => { + localStorage.clear(); + vi.useFakeTimers(); + }); + + afterEach(() => { + vi.restoreAllMocks(); + localStorage.clear(); + }); + + it('should allow first attempt', () => { + const { result } = renderHook(() => useRateLimit('test-key', 1000)); + + let allowed: boolean = false; + act(() => { + allowed = result.current.checkRateLimit(); + }); + + expect(allowed).toBe(true); + expect(result.current.remainingTime).toBe(0); + }); + + it('should block immediate second attempt', () => { + const { result } = renderHook(() => useRateLimit('test-key', 1000)); + + act(() => { + result.current.checkRateLimit(); + }); + + let allowed: boolean = true; + act(() => { + allowed = result.current.checkRateLimit(); + }); + + expect(allowed).toBe(false); + expect(result.current.remainingTime).toBeGreaterThan(0); + }); + + it('should allow attempt after cooldown', () => { + const { result } = renderHook(() => useRateLimit('test-key', 1000)); + + act(() => { + result.current.checkRateLimit(); + }); + + act(() => { + vi.advanceTimersByTime(1100); + }); + + let allowed: boolean = false; + act(() => { + allowed = result.current.checkRateLimit(); + }); + + expect(allowed).toBe(true); + expect(result.current.remainingTime).toBe(0); + }); +}); diff --git a/src/hooks/useRateLimit.ts b/src/hooks/useRateLimit.ts new file mode 100644 index 0000000..8648a0e --- /dev/null +++ b/src/hooks/useRateLimit.ts @@ -0,0 +1,38 @@ +import { useState, useCallback } from 'react'; + +interface UseRateLimitReturn { + checkRateLimit: () => boolean; + remainingTime: number; +} + +export function useRateLimit(key: string, cooldownMs: number): UseRateLimitReturn { + const [remainingTime, setRemainingTime] = useState(0); + + const checkRateLimit = useCallback(() => { + try { + const now = Date.now(); + const lastAttempt = localStorage.getItem(key); + + if (lastAttempt) { + const lastTime = parseInt(lastAttempt, 10); + const timePassed = now - lastTime; + + if (timePassed < cooldownMs) { + const remaining = Math.ceil((cooldownMs - timePassed) / 1000); + setRemainingTime(remaining); + return false; + } + } + + localStorage.setItem(key, now.toString()); + setRemainingTime(0); + return true; + } catch (error) { + console.warn('LocalStorage not available:', error); + // Fail safe: allow action if storage fails + return true; + } + }, [key, cooldownMs]); + + return { checkRateLimit, remainingTime }; +} diff --git a/src/i18n/de.ts b/src/i18n/de.ts index bc345f5..0b42d51 100644 --- a/src/i18n/de.ts +++ b/src/i18n/de.ts @@ -96,6 +96,7 @@ export const de = { sending: 'Wird gesendet...', success: 'Nachricht erfolgreich gesendet! Ich melde mich bald bei Ihnen.', error: 'Fehler beim Senden. Bitte versuchen Sie es erneut oder kontaktieren Sie mich direkt.', + rateLimit: 'Zu viele Anfragen. Bitte warten Sie einen Moment.', }, info: { title: 'Kontaktdaten', diff --git a/src/i18n/en.ts b/src/i18n/en.ts index 27651e3..20c8a34 100644 --- a/src/i18n/en.ts +++ b/src/i18n/en.ts @@ -98,6 +98,7 @@ export const en: Translations = { sending: 'Sending...', success: 'Message sent successfully! I\'ll get back to you soon.', error: 'Error sending message. Please try again or contact me directly.', + rateLimit: 'Too many requests. Please wait a moment.', }, info: { title: 'Contact Info', diff --git a/src/pages/Contact.tsx b/src/pages/Contact.tsx index ef7bc33..d11befb 100644 --- a/src/pages/Contact.tsx +++ b/src/pages/Contact.tsx @@ -2,6 +2,7 @@ import { useState, type FormEvent } from "react"; import { motion } from "motion/react"; import emailjs from "@emailjs/browser"; import { useTranslation } from "../i18n"; +import { useRateLimit } from "../hooks"; import { config } from "../config"; import { Button, Input, Textarea } from "../components/ui"; import { sanitizeInput } from "../utils/security"; @@ -38,6 +39,8 @@ export function Contact() { const [submitStatus, setSubmitStatus] = useState< "idle" | "success" | "error" >("idle"); + const [rateLimitError, setRateLimitError] = useState(false); + const { checkRateLimit } = useRateLimit("contact-form", 60000); // 1 minute cooldown const validateForm = (): boolean => { const newErrors: FormErrors = {}; @@ -73,8 +76,14 @@ export function Contact() { const handleSubmit = async (e: FormEvent) => { e.preventDefault(); + setRateLimitError(false); if (!validateForm()) return; + if (!checkRateLimit()) { + setRateLimitError(true); + return; + } + setIsSubmitting(true); setSubmitStatus("idle"); @@ -215,6 +224,16 @@ export function Contact() { {t.contact.form.error} )} + + {rateLimitError && ( + + {t.contact.form.rateLimit} + + )} diff --git a/verification.png b/verification.png new file mode 100644 index 0000000000000000000000000000000000000000..c09c6c6ff25531db37b4ccad3b260c8ffddaf0c5 GIT binary patch literal 49643 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