So sieht das Ergebnis eines Audits aus: jeder Befund mit Schweregrad, Beleg, Risiko in einfachen Worten und einer Empfehlung.
BeispielBeispiel: Dieser Bericht beschreibt eine erfundene Anwendung. Er enthält keinen echten Kunden, keine echten Daten und keine Zugangsdaten.
Zusammenfassung
Technik
Next.js, Supabase, ein Zahlungsanbieter, betrieben auf Vercel
Befunde
Kritisch: 1Hoch: 3Mittel: 3Niedrig: 2
Empfehlung
Härten, nicht neu bauen. Anmeldung und Datenmodell sind tragfähig; die Befunde lassen sich in gezielten Arbeitspaketen beheben, beginnend mit den kritischen und hohen.
Befunde
F-01 Zeilenzugriff auf die Tabelle invoices ungeschützt
KritischBereich: Security-Hardening
Beleg
Für die Tabelle invoices ist der zeilenweise Zugriffsschutz abgeschaltet, und der öffentliche Schlüssel, der mit der Browser-App ausgeliefert wird, kann jede Zeile lesen.
Risiko
Jeder Besucher kann die Rechnungen aller Kunden lesen, einschließlich Namen und Beträgen.
Empfehlung
Zeilen-Zugriffsregeln aktivieren, eine Regel ergänzen, die jede Zeile auf ihren Eigentümer beschränkt, und vor der Veröffentlichung mit zwei Konten testen.
Codesupabase/policies.sql
- -- noch keine Regel (Zeilenschutz ausgeschaltet)+ alter table invoices enable row level security;+ create policy "owner reads own invoices" on invoices+ for select using (auth.uid() = user_id);
F-02 Dienstschlüssel in der Git-Historie und im Browser-Bundle
HochBereich: Security-Hardening
Beleg
Ein Schlüssel mit Administratorrechten steht in einem frühen Commit und ist in das JavaScript für den Browser einkompiliert.
Risiko
Wer die Entwicklerwerkzeuge des Browsers öffnet, kann als Administrator der Datenbank handeln.
Empfehlung
Den Schlüssel sofort erneuern, aus der Historie entfernen und Aufrufe, die ihn brauchen, in eine Server-Funktion verlagern, die ihn aus der Umgebung liest.
Codelib/supabase.ts
- const db = createClient(url, "sb_service_…")+ // nur serverseitig: dieses Modul nie im Client-Code importieren+ const db = createClient(url, process.env.SUPABASE_SERVICE_KEY!)
F-03 Admin-Routen sind nur im Browser geschützt
HochBereich: Security-Hardening
Beleg
Das Admin-Menü ist für normale Nutzer ausgeblendet, aber die API-Routen unter /api/admin prüfen die Rolle des Nutzers nicht.
Risiko
Jeder angemeldete Nutzer kann Administrator-Funktionen direkt aufrufen.
Empfehlung
Die Rolle bei jeder Admin-Route auf dem Server prüfen und pro Route einen Test ergänzen, der für normale Nutzer eine Ablehnung erwartet.
F-04 Der Zahlungs-Webhook akzeptiert gefälschte und wiederholte Anfragen
HochBereich: Stabilisierung & Refactoring
Beleg
Der Webhook prüft die Signatur des Zahlungsanbieters nicht und legt bei jeder Zustellung eine neue Rechnung an, auch bei Wiederholungen.
Risiko
Eine gefälschte Anfrage kann eine Rechnung als bezahlt markieren, und eine Wiederholung bucht dieselbe Zahlung doppelt.
Empfehlung
Signatur prüfen, jede Ereignis-Kennung speichern und bereits verarbeitete Ereignisse ignorieren.
Codeapi/webhook.ts
export async function POST(req: Request) {- const event = await req.json()+ const event = verifySignature(req, process.env.WEBHOOK_SECRET!)+ if (await alreadyProcessed(event.id)) return new Response(null, { status: 200 })
F-05 Anmeldung und Passwort-Zurücksetzen ohne Begrenzung
MittelBereich: Security-Hardening
Beleg
Die Endpunkte für Anmeldung und Passwort-Zurücksetzen akzeptieren beliebig viele Versuche pro Adresse und pro Konto.
Risiko
Passwörter lassen sich durch automatisierte Versuche erraten, und die Rücksetz-Mail lässt sich nutzen, um einen Nutzer zu überfluten.
Empfehlung
Versuche pro Konto und pro Adresse begrenzen, eine kurze Sperre ergänzen und Nutzer bei wiederholten Fehlversuchen benachrichtigen.
F-06 Keine Tests, durchgehend any-Typen und kopierter Datenzugriff
MittelBereich: Stabilisierung & Refactoring
Beleg
Es gibt keine automatisierten Tests, die meisten Funktionen sind mit any typisiert, und dieselbe Abfrage ist in viele Komponenten kopiert.
Risiko
Jede Änderung kann Unbeteiligtes zerstören, und niemand merkt es, bis ein Nutzer es meldet.
Empfehlung
Zuerst Tests rund um Abrechnung und Anmeldung ergänzen, any in der Datenschicht ersetzen und die kopierten Abfragen in ein Modul verlagern.
F-07 Staging nutzt die Produktionsdatenbank, Backups wurden nie wiederhergestellt
MittelBereich: Production-Readiness & Betrieb
Beleg
Die Staging-Seite ist mit der Datenbank-URL der Produktion konfiguriert, und die Backup-Einstellung ist aktiv, doch eine Wiederherstellung wurde nie versucht.
Risiko
Ein Test kann Kundendaten zerstören, und ein nie wiederhergestelltes Backup funktioniert im Ernstfall vielleicht nicht.
Empfehlung
Staging eine eigene Datenbank geben, das letzte Backup einmal dorthin zurückspielen und die Schritte aufschreiben.
F-08 Zwei Abhängigkeiten mit bekannten Sicherheitslücken hoher Schwere
NiedrigBereich: Audit & Triage
Beleg
Die Abhängigkeitsprüfung nennt zwei Pakete mit bekannten Sicherheitslücken hoher Schwere, beide indirekt eingebunden.
Risiko
Bekannte Schwachstellen lassen sich ausnutzen, ohne die App selbst zu kennen.
Empfehlung
Pakete aktualisieren oder ersetzen, automatische Update-Prüfungen aktivieren und die Prüfung vor jeder Veröffentlichung wiederholen.
F-09 Keine Fehlerüberwachung und kein Health-Check
NiedrigBereich: Production-Readiness & Betrieb
Beleg
Fehler sind nur in der Browser-Konsole sichtbar, und es gibt keinen Endpunkt, der einem Monitor sagt, ob die App läuft.
Risiko
Ausfälle und fehlschlagende Zahlungen bemerken zuerst die Kunden.
Empfehlung
Fehler-Tracking, einen Health-Endpunkt und einen Alarm an eine Person ergänzen und in der Staging-Umgebung prüfen.
Das Gleiche für Ihre App?
Wir beginnen mit einem Audit mit festem Umfang. Sie erhalten einen Bericht wie diesen für Ihren eigenen Code.
Wir verwenden ausschließlich technisch notwendige und anonyme, cookiefreie Analyse-Technik. Nicht notwendige Cookies oder Tracking-Skripte setzen wir nur mit Ihrer Zustimmung. Mehr dazu in unserer Datenschutzerklärung.