Produktionsreife-Check · Beispiel
So sieht ein Befund aus.
Ein erfundener Prototyp, geprüft wie ein echter. Aufbau und Tonfall wie im Bericht, den ihr bekommt.
Beispiel mit erfundenem Gegenstand. Kein Kunde, kein echtes Projekt.
const supabase = createClient( import.meta.env.VITE_SUPABASE_URL, 'eyJhbGciOiJIUzI1NiIs…', // service_role);export async function saveLead(form) { if (!form.email.includes("@")) return; await supabase.from('leads').insert(form);}- kritischService-Role-Key im Client-BundleZ. 3
- hochInsert ohne RechteprüfungZ. 8
- hochValidierung nur im BrowserZ. 7
- mittelNur die Hälfte kommt aus der UmgebungZ. 2
- Gegenstand
- Anfrage-Portal: Formular für Kundenanfragen mit Übersicht für den Vertrieb, gebaut mit Lovable, Daten in Supabase.
- Umfang
- rund 2.400 Zeilen TypeScript, 14 Komponenten, 3 Tabellen
- Einsatz
- Soll öffentlich auf der Website laufen; speichert Name, E-Mail, Telefon und Freitext.
- Befunde
- 2 kritisch4 hoch3 mittel
Urteil · Beispiel
Härtbar.
Das Datenmodell ist schlicht und passt zum Zweck. Die Befunde liegen an den Rändern: Schlüssel, Rechte, Validierung, Betrieb. Nichts davon verlangt, das Fundament neu zu bauen.
Die beiden kritischen Befunde sind in einem halben Tag behoben und sollten es vor allem anderen werden, auch wenn das Portal noch gar nicht öffentlich ist.
Befundliste
Sortiert nach Schweregrad, nicht nach Regelverstoß.
Was sich nachstellen ließ, ist nachgestellt. Was nicht, steht als Verdacht drin.
- kritischB01
Service-Role-Key im Client-Bundle
Befund
Der Supabase-Schlüssel mit Administratorrechten steht im Frontend-Code und wird mit dem JavaScript an jeden Besucher ausgeliefert.
Warum es zählt
Wer die Seite öffnet, kann alle Anfragen lesen, ändern und löschen. Nachgestellt: Mit dem Schlüssel aus dem ausgelieferten Bundle ließ sich die Tabelle vollständig abrufen.
MaßnahmeSchlüssel sofort rotieren, im Client nur den Anon-Key verwenden, Schreibzugriffe über eine Edge Function.≈ 0,5 Tage
- kritischB02
Export-Endpunkt ohne Anmeldung erreichbar
Befund
Die CSV-Ausgabe für den Vertrieb prüft nicht, wer sie aufruft. Die Route ist nur nicht verlinkt.
Warum es zählt
Nicht verlinkt ist nicht geschützt. Nachgestellt: Ein direkter Aufruf ohne Anmeldung lieferte den kompletten Export.
MaßnahmeAnmeldung erzwingen, Zugriff auf die Vertriebsrolle beschränken.≈ 0,5 Tage
- hochB03
Insert ohne Rechteprüfung
Befund
Neue Anfragen werden mit Administratorrechten geschrieben; Row Level Security ist für die Tabelle abgeschaltet.
Warum es zählt
Selbst nach dem Tausch des Schlüssels kann jeder beliebige Datensätze anlegen. Nachgestellt mit einem direkten Request.
MaßnahmeRow Level Security einschalten, eine Policy nur für das Anlegen eigener Anfragen.≈ 1 Tag
- hochB04
Validierung nur im Browser
Befund
Ob die E-Mail-Adresse gültig ist und Felder befüllt sind, prüft nur das Formular.
Warum es zählt
Ein direkter Request umgeht die Prüfung. In der Tabelle landen leere und beliebig lange Einträge.
MaßnahmeDieselben Regeln serverseitig in der Edge Function, Längenbegrenzung in der Datenbank.≈ 0,5 Tage
- hochB05
Analyse-Skript liest Formularfelder mit
Befund
Ein eingebundenes Session-Recording-Skript zeichnet Eingaben auf, auch in den Feldern für Telefon und Freitext.
Warum es zählt
Personenbezogene Daten gehen ohne Einwilligung an einen Anbieter in den USA. Nachgestellt im Netzwerkprotokoll des Browsers.
MaßnahmeSkript entfernen oder Formularfelder ausnehmen und nur nach Einwilligung laden; Auftragsverarbeitung klären.≈ 0,5 Tage
- hochB06
Keine Datensicherung
Befund
Das Projekt läuft im kostenlosen Tarif. Dort gibt es keine automatische Sicherung mit Wiederherstellung auf einen Zeitpunkt.
Warum es zählt
Ein versehentliches Löschen ist endgültig. Verdacht: Ein manueller Export ist nicht dokumentiert, ließ sich im Zeitrahmen aber nicht ausschließen.
MaßnahmeBezahlten Tarif mit Sicherung wählen oder nächtlichen Export einrichten, Wiederherstellung einmal erproben.≈ 0,5 Tage
- mittelB07
Kein Löschkonzept
Befund
Anfragen bleiben unbegrenzt gespeichert. Es gibt keinen Weg, eine einzelne Anfrage auf Wunsch zu löschen oder Auskunft zu geben.
Warum es zählt
Auskunfts- und Löschpflichten lassen sich so nur von Hand und unvollständig erfüllen.
MaßnahmeAufbewahrungsfrist festlegen, automatisch löschen, Lösch- und Auskunftsfunktion für den Vertrieb.≈ 1 Tag
- mittelB08
Fehler landen nirgends
Befund
Schlägt das Speichern fehl, sieht der Besucher eine Erfolgsmeldung, und niemand erfährt davon.
Warum es zählt
Anfragen gehen still verloren. Auffallen würde das erst, wenn ein Kunde nachfragt.
MaßnahmeFehler im Formular anzeigen, protokollieren und bei Häufung benachrichtigen.≈ 0,5 Tage
- mittelB09
Keine Tests
Befund
Es gibt keinen einzigen automatisierten Test, auch nicht für das Speichern einer Anfrage.
Warum es zählt
Jede der Maßnahmen oben ist eine Änderung ohne Sicherheitsnetz. Der Prototyp ist klein genug, dass sich das noch billig nachholen lässt.
MaßnahmeTests für die Kernwege: Anfrage anlegen, abweisen, exportieren, löschen.≈ 2 Tage
Nicht geprüft
Was dieser Bericht nicht sagt.
- Rechtliche Bewertung der Datenschutzerklärung. Wir benennen, wo juristischer Rat nötig ist.
- Lastverhalten und Kosten unter Nutzung. Das wäre Teil des Audits.
- Penetrationstest der Supabase-Plattform selbst.
Danach
Ein Gespräch über das Ergebnis.
Zum Bericht gehört ein Termin, in dem wir ihn durchgehen. Was ihr danach macht, entscheidet ihr: selbst härten, uns beauftragen oder den Prototyp verwerfen.
Dieses Beispiel ist ein Produktionsreife-Check (3 Werktage, 3.000 € netto). Das Produktionsreife-Audit geht für größere Anwendungen weiter: DSGVO-Betrachtung mit Zuarbeit für euer Verarbeitungsverzeichnis, Last- und Kostenverhalten unter realistischer Nutzung und mehr.
Euer Prototyp als Nächstes?
Repo-Zugang genügt. Den Rest klären wir im Gespräch.