Zum Inhalt springen

Sicherheitsgrundlagen

Ein geheimer Stripe-Schlüssel im Frontend kann Geld bewegen

Ein geheimer Stripe-Schlüssel im Frontend kann erstatten, abbuchen und jeden Kundendatensatz lesen, den du hast. Dein pk_live_-Schlüssel gehört dorthin.

Vlad Tkachenko10 Min. Lesezeit
Eine Ladenkasse mit offen stehender Geldschublade, und ein Schlüssel steckt noch im Schloss an der Vorderseite des Geräts.

Kurz gesagt

  • Ein geheimer Stripe-Schlüssel im Frontend ist das Leck, das deinem Konto berechnet wird: Erstattungen, neue Abbuchungen und jeder Kundendatensatz, den du hast.
  • pk_live_ gehört in deine App und gehörte immer dorthin. sk_live_ unterscheidet sich um ein Zeichen und hat uneingeschränkte Rechte über dein ganzes Stripe-Konto.
  • Erzeuge zuerst den Ersatzschlüssel, nimm ihn in Betrieb, lass dann den alten ablaufen. Die Zeile aus dem Code zu löschen holt nichts zurück, was schon heruntergeladen wurde.
  • Wir fanden einen aktiven geheimen Stripe-Schlüssel in 3 von 30.998 gescannten Apps. Alle drei kamen mit Note D heraus.

Öffne deine laufende App in einem Browser, sieh dir den Seitenquelltext an und such darin nach sk_live_. Kommt eine lange Zeichenkette zurück, liegt ein geheimer Stripe-Schlüssel offen in deinem Frontend, und jeder Besucher, den du je hattest, hätte ihn kopieren können.

Hier ist der Punkt, an dem der allgemeine Rat zu API-Schlüsseln danebenliegt: Stripe gibt dir zwei aktive Schlüssel, sie sehen fast gleich aus, und einer davon soll in deiner App liegen. Der Schlüssel, der mit pk_live_ beginnt, gehört dorthin. Der Schlüssel, der mit sk_live_ beginnt, hat in Stripes eigenen Worten uneingeschränkte Rechte für alle APIs. Sie unterscheiden sich um ein Zeichen mitten in einer langen Zeichenkette, und das ist der größte Teil des Grundes, warum das immer wieder passiert.

Zwischen dem 12. und 14. August 2026 haben wir neun externe Prüfungen über 30.998 laufende Apps laufen lassen, gebaut mit Lovable, Bolt, v0, Replit und Base44. Drei davon lieferten einen aktiven geheimen Stripe-Schlüssel aus, zwei weitere einen eingeschränkten, womit das zu den seltensten Funden des Durchlaufs gehört; dieselben neun Prüfungen fanden in 1.142 Apps einen Google-API-Schlüssel. Alle drei geheimen Schlüssel kamen mit Note D heraus, weil ein einziger kritischer Befund die Note dort deckelt, egal was die App sonst richtig gemacht hat. Die vollständigen Zahlen stehen in unserem Scan-Bericht.

Ist ein geheimer Stripe-Schlüssel im Frontend ein Problem?

Ja, wenn die Zeichenkette mit sk_live_ beginnt. Nein, wenn sie mit pk_live_ beginnt.

Stripe gibt zwei aktive Schlüssel aus, weil die beiden Hälften einer Zahlung an zwei verschiedenen Orten stattfinden. Stell dir einen Ladentresen vor. Das Kartenlesegerät zeigt zur Kundschaft und ist gut sichtbar festgeschraubt, und das Schlimmste, was eine Fremde damit anstellen kann, ist dich zu bezahlen. Die Kasse hinter dem Tresen ist ein ganz anderes Ding. Sie geht auf, sie enthält die Tageseinnahmen, und in der Schublade darunter liegt für jeden Kunden eine Karte mit seiner Anschrift darauf.

pk_live_ ist das Kartenlesegerät. Seine Aufgabe ist es, im Browser von jemand anderem ein Bezahlformular aufzubauen, und Stripes Dokumentation sagt, dass öffentliche Schlüssel im Frontend-Code offenliegen dürfen.

sk_live_ ist der Kassenschlüssel. Stripe beschreibt geheime Schlüssel als Schlüssel mit uneingeschränkten Rechten für alle APIs, was derselbe Satz von der anderen Seite gelesen ist: es gibt nichts in deinem Konto, was er nicht erreicht.

Deine App braucht das Kartenlesegerät im Browser, um überhaupt eine Zahlung annehmen zu können. Den Kassenschlüssel sollte sie nie brauchen.

pk_live_ und sk_live_: wie du sie auseinanderhältst

Lies das zweite Zeichen des Präfixes. Das ist die ganze Prüfung.

SchlüsselBeginnt mitIm Browser unbedenklich?Was er tut
Öffentlichpk_live_…Gehört hierhinBaut das Bezahlformular und tokenisiert eine Karte. Kann keine Kunden lesen und kein Geld bewegen.
Geheimsk_live_…NiemalsUneingeschränkte Rechte für alle APIs von Stripe, über dein ganzes Konto.
Eingeschränktrk_live_…NiemalsNur die Rechte, die du beim Anlegen angekreuzt hast. Trotzdem ein gültiger Zugang in fremder Hand.
Testschlüsselsk_test_, pk_test_NeinBerührt nur deine Sandbox. Ein kleineres Problem mit derselben Gewohnheit dahinter.

Die Mitte des Präfixes ist das Zweite, was du liest. _test_ erreicht nichts außer deiner Sandbox, ein geleakter Testschlüssel kostet dich also kein Geld; er veröffentlicht trotzdem, wie deine Integration gebaut ist, und Stripes Leitlinie lautet, jeden geheimen oder eingeschränkten Schlüssel an der falschen Stelle als kompromittiert zu behandeln. Neuere Konten können außerdem einen Organisationsschlüssel tragen, der mit sk_org_ beginnt und über mehr als ein Stripe-Konto hinweg arbeitet. Für ihn gilt dieselbe Regel, und ein Leck reicht dort weiter als über ein einzelnes Konto.

Was jemand mit einem geleakten geheimen Stripe-Schlüssel anstellen kann

Alles, was du in deinem eigenen Dashboard tun kannst und wofür kein Passwort nötig ist.

Nicht „unbefugten Zugriff erlangen". Konkret, mit nichts als der Zeichenkette und einem Terminal: deine vollständige Kundenliste lesen, mit Namen, E-Mail-Adressen, Rechnungsanschriften und den letzten vier Ziffern jeder Karte. Jede Zahlung nachlesen, die du je erhalten hast, und wofür jeder Kunde bezahlt hat. Erstattungen auslösen. Abbuchungen und Bezahllinks in deinem Namen anlegen. Abos kündigen.

Beide Schlüssel liegen in derselben Datei. Die zweite Spalte ist das, was das eine zusätzliche Zeichen einkauft, und jeder rote Haken darin ist eine Anfrage, die durchgeht.

Dann gibt es noch den Gebrauch, der mit dir gar nichts zu tun hat. Dein Konto wird zum Ort für Card Testing, Stripes eigener Begriff dafür, dass eine Betrügerin gestohlene Kartennummern durch die Integration von irgendwem schickt, um die noch gültigen zu finden. Die Karten gehören anderen Leuten. Die Ablehnungen, die Rückbuchungen und das Erklären gehören dir.

Was sie meistens nicht können, ist sich selbst bezahlen. Eine Erstattung geht zurück auf die Karte, mit der ursprünglich bezahlt wurde, und eine Auszahlung geht auf das hinterlegte Bankkonto, und das ist deins. Das klingt nach einer guten Nachricht und ist keine: es bedeutet, dass der Schaden als abfließendes Geld, als kopierte Kundendaten und als ein für fremden Betrug benutztes Konto ankommt, statt als Überweisung, auf die du zeigen und der du nachgehen könntest.

Nichts davon braucht raffinierte Angreifer. Stripes eigene Dokumentation sagt, dass betrügerische Akteure fortlaufend öffentliche Codebestände nach offenliegenden Schlüsseln durchsuchen, und diese Scanner müssen nicht wissen, wer du bist, um deinen zu finden.

Wie du einen geheimen Stripe-Schlüssel ohne Zahlungsausfall austauschst

Erzeuge zuerst den Ersatz, nimm ihn in Betrieb, lass dann den alten ablaufen. In dieser Reihenfolge.

  1. Lege im Stripe-Dashboard einen neuen geheimen Schlüssel an. Lass den alten vorerst in Ruhe; beide funktionieren gleichzeitig, und genau diese Überlappung hält deine Kasse am Laufen.
  2. Leg den neuen Schlüssel dorthin, wo der alte lag, und das sollte ein Server sein, eine Edge Function oder eine Serverless-Route. Niemals die App, die der Browser herunterlädt.
  3. Deploye, dann nimm eine echte Zahlung an. Eine gelungene Zahlung ist der einzige Beweis, dass der neue Schlüssel richtig verdrahtet ist.
  4. Lass den alten Schlüssel ablaufen. Stripe beschreibt das genau so: einen geheimen oder eingeschränkten Schlüssel ablaufen zu lassen hindert ihn an jedem weiteren API-Aufruf.
  5. Lies deine Zahlungshistorie für den Zeitraum, in dem der Schlüssel offenlag, und deine Stripe-Mails auf alles, was nicht von dir kam.

Ist der Schlüssel schon draußen und verlierst du lieber ein paar Zahlungen, als ihn noch eine Stunde aktiv zu lassen, dann mach es andersherum. Einen Schlüssel auszutauschen sperrt ihn unmittelbar und erzeugt einen neuen, und Stripe weist darauf hin, dass mit dem alten Schlüssel angelegte Webhook-Endpunkte aktiv bleiben, deine Ereignisverarbeitung überlebt den Notfall also.

Die Überlappung im mittleren Feld ist der ganze Sinn. Beide Schlüssel sind gleichzeitig aktiv, und das ist es, was den Wechsel ohne Lücke in deiner Kasse möglich macht.

Es gibt noch einen Schritt, und es ist der, den die meisten zuerst machen: den Schlüssel aus dem Code löschen. Mach es, und sei dir im Klaren darüber, was es bewirkt. Deine Besucher haben die Datei, die ihn trug, längst heruntergeladen, diese Datei liegt in Browser-Caches, über die du keine Kontrolle hast, und der alte Wert steht weiterhin in deiner Versionsgeschichte. Den Schlüssel bei Stripe ablaufen zu lassen ist das, was die Tür schließt. Die Zeile zu entfernen hält dich davon ab, ihn erneut auszuliefern.

Öffentliche Schlüssel lassen sich übrigens gar nicht ablaufen. Stripe hat die Funktion nie gebaut, weil dieser Schlüssel nie geheim sein sollte.

Was ein eingeschränkter Stripe-Schlüssel ist und wann er die Antwort ist

Ein Schlüssel, der für eine Aufgabe zugeschnitten ist statt für jede.

Ein eingeschränkter Schlüssel beginnt mit rk_live_ und trägt nur die Rechte, die du beim Anlegen ankreuzt. Ein Schlüssel, der Rechnungen lesen darf, kann keine Erstattung auslösen. Ein Schlüssel, der Abbuchungen anlegen darf, kann deine Kundenliste nicht lesen. Stripe empfiehlt aus genau diesem Grund den Umstieg von geheimen auf eingeschränkte Schlüssel, und das ist guter Rat für den Code, der auf deinem Server läuft.

Es ist kein Weg, einen Schlüssel im Browser vertretbar zu machen. Zwei der 30.998 Apps in unserem Durchlauf lieferten einen eingeschränkten Schlüssel im Frontend aus, und beide kamen mit Note C heraus. Unser Scan bewertet einen eingeschränkten Schlüssel als hohen Befund, wo ein geheimer ein kritischer ist, und ein einziger hoher Befund deckelt die Note bei C. Wer diesen Schlüssel findet, bekommt weiterhin jedes Recht, das du angekreuzt hast, von überall.

Wo ein eingeschränkter Schlüssel seinen Platz verdient, ist der unbequeme Fall dazwischen, und vibe-codierte Apps produzieren eine Menge davon. Ein Automatisierungswerkzeug, das deine Auszahlungen lesen muss. Ein Auswertungsskript, das jemand auf Fiverr für dich geschrieben hat. Eine Edge Function, die immer nur eine einzige Art von Abbuchung anlegt. Jedes davon läuft auf einem Server und jedes davon braucht einen Bruchteil deines Kontos, also bekommt jedes seinen eigenen Schlüssel mit genau diesem Bruchteil angekreuzt, und an dem Tag, an dem eines leckt, ziehst du einen Schlüssel zurück, statt deine ganze Integration neu zu verdrahten.

Wie du prüfst, was deine App tatsächlich ausliefert

Fang von Hand an, es kostet nichts und braucht nichts Installiertes. Öffne deine laufende Website, sieh dir den Seitenquelltext an und such darin nach sk_live_, dann nach rk_live_, dann nach pk_live_. Den dritten zu finden und die ersten beiden nicht, ist das Ergebnis, das du willst.

Was eine Suche im Seitenquelltext verpasst, ist das JavaScript, das die Seite danach lädt, und bei einer App von Lovable, Bolt oder Replit ist das so gut wie alles. Unser kostenloser Scanner öffnet deine App in einem echten Browser, wartet, bis die Bundles eintreffen, und liest die. Er ordnet ein, was er findet, statt nur nach schlüsselförmigen Zeichenketten zu suchen, also kommt pk_live_ als richtig markiert zurück und sk_live_ als kritischer Befund, und die beiden landen nie auf demselben Stapel.

Schlüssel sind eine von neun rein lesenden Prüfungen. Die übrigen sind der Grund, warum eine Note dir mehr sagt als eine Suche in deinem eigenen Seitenquelltext.

Note, Punktzahl und die Anzahlen stehen in etwa 20 Sekunden auf dem Bildschirm, ohne Konto. Gibst du eine E-Mail-Adresse an, kommt die ausführliche Liste dazu, zusammen mit einer Lösung, die für den von dir benutzten Builder geschrieben ist und die du direkt einfügen kannst.

Drei Dinge, die der Scan nicht tut, und das sind die Gründe, warum du ihn ohne Sorge auf eine laufende App mit echten Zahlungen richten kannst: er meldet sich nie an, er schreibt nie etwas, und er behält nie einen gefundenen Schlüssel. Ein offenliegendes Geheimnis wird als maskierter Hinweis der Form sk_live_…a1b2 gespeichert, und der echte Wert wird weggeworfen. Scanne deine App, oder lies vorher, worauf jede der neun Prüfungen schaut.

Was du jetzt tun solltest

Was zu tun ist

  • Lies vor allem anderen das zweite Zeichen. pk_live_ in deinem Bundle ist richtig und braucht nichts; sk_live_ und rk_live_ brauchen etwas.
  • Erzeuge zuerst den Ersatzschlüssel und bestätige eine echte Zahlung damit, lass dann bei Stripe den alten ablaufen. Das Ablaufen ist es, was die Tür schließt.
  • Den Schlüssel aus dem Code zu löschen schließt für sich genommen nichts. Die Datei, die ihn trug, ist längst heruntergeladen, zwischengespeichert und in deiner Versionsgeschichte.
  • Verleg alles, was den Schlüssel brauchte, auf einen Server: eine Edge Function, eine Serverless-Route, irgendetwas, das nicht der Browser ist.
  • Lies deine Zahlungshistorie und deine Kundenliste für den Zeitraum, in dem der Schlüssel aktiv war. Der Austausch stoppt, was als Nächstes passiert, und sagt nichts über das, was schon passiert ist.
  • Gib jeder serverseitigen Aufgabe ihren eigenen eingeschränkten Schlüssel mit nur den nötigen Rechten, damit das nächste Leck dich einen Schlüssel kostet und nicht alle.

Ein Stripe-Schlüssel kommt meistens spät. Die App geht live, sie läuft eine Weile, und dann fügst du eines Tages die Kasse hinzu, und genau dieses Deploy legt zum ersten Mal einen Zahlungszugang ins Bundle. Der Scan, den du beim Start laufen ließest, war eine Momentaufnahme einer App, die noch kein Geld annehmen konnte.

Reeve Monitor ist für diese Lücke gebaut. Es lässt alle neun Prüfungen jede Stunde über bis zu drei Apps laufen, prüft die Erreichbarkeit alle 60 Sekunden, sagt dir an dem Tag Bescheid, an dem sich ein Ergebnis ändert, statt darauf zu warten, dass du nachsiehst, und schickt einen monatlichen Bericht in verständlicher Sprache. Ein Schlüssel, der mit einem Deploy am Donnerstag ins Bundle gerät, ist in dem Scan dieser Stunde. Es kostet €12 im Monat laut Liste, mit sieben kostenlosen Tagen, bevor es abbucht, und die Preisseite liegt manchmal unter der Zahl hier und nie darüber.

Wenn du das lieber als Liste durchgehst: die 10-Minuten-Sicherheitscheckliste deckt das hier zusammen mit den anderen Dingen ab, die es in einer frisch gestarteten App zu schließen lohnt. Für die größere Frage, welche Schlüssel überhaupt in einen Browser gehören, haben wir eine Anleitung zum Unterscheiden öffentlicher und geheimer Schlüssel, dieselbe Frage für einen OpenAI-Schlüssel, und eine Bestandsaufnahme dessen, was 30.998 Apps tatsächlich ausgeliefert haben.

FAQ

Ist mein öffentlicher Stripe-Schlüssel im Frontend unbedenklich?

Ja. Ein Schlüssel, der mit pk_live_ beginnt, gehört in die Seite, und Stripe sagt das in seiner eigenen Dokumentation: öffentliche Schlüssel dürfen im Frontend-Code offenliegen. Er baut das Bezahlformular und tokenisiert eine Karte. Er kann deine Kunden nicht lesen, kein Geld bewegen und nichts erstatten. Wenn ein Scanner oder eine Bekannte dir sagt, ein Stripe-Schlüssel liege offen, lies zuerst das zweite Zeichen, denn ein pk_live_-Schlüssel in deinem Bundle ist deine Integration so, wie Stripe sie entworfen hat.

Was kann jemand mit einem geleakten geheimen Stripe-Schlüssel anstellen?

Alles, was du in deinem eigenen Dashboard tun kannst und wofür kein Passwort nötig ist. Er kann deine vollständige Kundenliste mit Namen, E-Mail-Adressen, Rechnungsanschriften und den letzten vier Ziffern jeder Karte lesen, jede Zahlung nachlesen, die du je erhalten hast, Erstattungen auslösen, bis dein Guthaben leer ist, Abbuchungen und Bezahllinks anlegen und gestohlene Kartennummern durch dein Konto laufen lassen, um die noch gültigen zu finden. Das Letzte nennt Stripe Card Testing, und bei dir kommt es als Rückbuchungen und Ablehnungen auf einem Konto an, das du für ruhig gehalten hast.

Wie tausche ich einen Stripe-Schlüssel ohne Ausfall aus?

Erzeuge zuerst den Ersatz. Lege im Stripe-Dashboard einen neuen geheimen Schlüssel an, leg ihn dorthin, wo der alte auf deinem Server lag, deploye und bestätige eine echte Zahlung über den neuen Schlüssel. Erst danach lässt du den alten ablaufen, was ihn an jedem weiteren API-Aufruf hindert. Ist der Schlüssel schon öffentlich und verlierst du lieber ein paar Zahlungen, als ihn aktiv zu lassen, dann tausche ihn stattdessen sofort: das Austauschen sperrt den Schlüssel unmittelbar und erzeugt einen neuen, und Stripe weist darauf hin, dass mit dem alten Schlüssel angelegte Webhook-Endpunkte aktiv bleiben.

Was ist ein eingeschränkter Stripe-Schlüssel?

Ein Schlüssel, den du für eine einzige Aufgabe zuschneidest. Ein eingeschränkter Schlüssel beginnt mit rk_live_ und trägt nur die Rechte, die du beim Anlegen ankreuzt, sodass ein Schlüssel, der Rechnungen lesen darf, keine Erstattung auslösen kann. Stripe empfiehlt aus genau diesem Grund den Umstieg von geheimen auf eingeschränkte Schlüssel. Lies das als Rat für den Code auf deinem Server, nicht als Weg, einen Schlüssel im Browser vertretbar zu machen: ein eingeschränkter Schlüssel in deinem Bundle bleibt eine Zugangsberechtigung, die eine Fremde benutzen kann, und unser Scan bewertet ihn als hohen Befund.

Sagt Stripe mir Bescheid, wenn mein Schlüssel leakt?

Manchmal, und verlassen kannst du dich nicht darauf. Stripe sagt, es durchsuche das Internet aktiv nach geleakten API-Schlüsseln, unter anderem mit dem GitHub Token Scanner, und benachrichtige dich womöglich oder deaktiviere einen gefundenen Schlüssel. Die eigene Best-Practices-Seite ergänzt, dass eine Erkennung nicht garantiert ist. Am besten funktioniert diese Suche bei öffentlichen Code-Repositories, und ein Schlüssel, der ins JavaScript deiner eigenen Domain kompiliert wurde, ist kein Repository. Behandle jeden Schlüssel, den du irgendwo gesehen hast, wo er nicht hingehört, als kompromittiert, ob Stripe sich meldet oder nicht.

Ist ein Testschlüssel (sk_test_) im Frontend gefährlich?

Er ist ein deutlich kleineres Problem als ein aktiver und trotzdem eine Sache, die du schließen solltest. Ein Testschlüssel berührt nur deine Sandbox, niemand kann damit also dein Geld nehmen. Was er herausgibt, ist eine brauchbare Karte deiner Integration, und meistens bedeutet er, dass dieselbe Kopieren-und-Einfügen-Gewohnheit nur ein Deploy davon entfernt ist, den aktiven Schlüssel auszuliefern. Stripe behandelt jeden geheimen oder eingeschränkten Schlüssel, der an der falschen Stelle auftaucht, als kompromittiert. Lass ihn ablaufen und verleg den Aufruf auf einen Server.

Geschrieben von

Vlad Tkachenko

Gründer, Reeve

Ich schaue mir den ganzen Tag Apps an, die mit Lovable, Bolt, v0, Cursor und Replit gebaut wurden, und die kurze Liste von Fehlern, die darin immer wieder auftauchen.

Mehr über den Autor

Weiterlesen

Alle Artikel

Unsicher, wie es um deine eigene App steht?

Starte einen kostenlosen Scan und erhalte in rund 20 Sekunden eine verständliche Note von A bis F. Ohne Konto, ohne Karte.

App kostenlos scannen

Automatisierte externe Prüfung, kein vollständiges Audit. Das Fehlen von Funden ist keine Garantie für Sicherheit.