[{"data":1,"prerenderedAt":1055},["ShallowReactive",2],{"blog-de-certificate-not-trusted":3,"blog-index-de":524},{"id":4,"title":5,"body":6,"category":482,"cover":483,"coverAlt":484,"description":485,"draft":486,"extension":487,"faq":488,"image":504,"keywords":505,"meta":513,"navigation":514,"ogTitle":5,"path":515,"published":516,"seo":517,"stem":518,"tldr":519,"updated":516,"__hash__":523},"blog_de\u002Fblog\u002Fcertificate-not-trusted.md","Zertifikat nicht vertrauenswürdig: drei Ursachen außer Ablauf",{"type":7,"value":8,"toc":468},"minimark",[9,13,16,25,30,33,36,39,131,134,137,141,144,156,186,189,200,204,207,210,238,244,247,251,254,257,260,263,267,270,273,276,281,299,303,306,309,334,339,342,360,364,367,370,377,385,389,392,400,411,420,431,435,460],[10,11,12],"p",{},"Deine App hat gestern problemlos geladen. Heute schickt dir jemand einen\nScreenshot einer ganzseitigen Browserwarnung, die Verbindung sei nicht privat,\nund fragt, ob deine Seite gehackt wurde. Du öffnest das Zertifikat, und es ist\nbis zum nächsten Frühling gültig. Abgelaufen ist es also nicht, und der Browser\nsagt trotzdem, dem Zertifikat sei nicht zu vertrauen.",[10,14,15],{},"Der naheliegende Schritt ist, es zu verlängern, und bei diesem Bildschirm ist es\nder falsche. Jede der drei Ursachen unten trifft ein Zertifikat, das bereits\ngültig datiert ist. Eine Verlängerung bringt dir also ein späteres Ablaufdatum\nauf einem Zertifikat, das aus einem anderen Grund weiter abgelehnt wird.",[10,17,18,19,24],{},"In ",[20,21,23],"a",{"href":22},"\u002Fblog\u002Fdomain-and-certificate-expiry","unserem Beitrag über den Ablauf"," ist das\nZertifikat die Zulassung im Fenster, die sagt, dass dieser Laden wirklich der auf\ndem Schild ist. Der Browser eines Besuchers liest auf dieser Zulassung drei\nDinge, bevor er jemanden hereinlässt: das Datum, den Namen des Ladens, für den\nsie ausgestellt wurde, und die Unterschrift dessen, der sie ausgestellt hat. Der\nAblauf ist das Datum. In diesem Artikel geht es um die anderen beiden.",[26,27,29],"h2",{"id":28},"warum-ist-mein-zertifikat-nicht-vertrauenswürdig-obwohl-es-nicht-abgelaufen-ist","Warum ist mein Zertifikat nicht vertrauenswürdig, obwohl es nicht abgelaufen ist?",[10,31,32],{},"Weil der Name oder die Unterschrift durchgefallen ist, und der Browser stellt bei\njeder seiner Prüfungen dieselbe Wand auf.",[10,34,35],{},"Einem Zertifikat wird nur vertraut, wenn es genau die Adresse in der\nAdressleiste des Besuchers nennt und von einer Stelle signiert wurde, der der\nBrowser schon vertraut, mit jedem Zertifikat dazwischen im Gepäck. Fällt eins\ndavon durch, zeigt Chrome die Warnung, dass die Verbindung nicht privat ist, und\nFirefox die Warnung vor einem möglichen Sicherheitsrisiko, genau wie bei einem\nabgelaufenen Zertifikat.",[10,37,38],{},"Was sich unterscheidet, ist das Kleingedruckte unter der Warnung. Lies es, bevor\ndu irgendetwas änderst:",[40,41,42,61],"table",{},[43,44,45],"thead",{},[46,47,48,52,55,58],"tr",{},[49,50,51],"th",{},"Was Chrome anzeigt",[49,53,54],{},"Was die Erklärung in Firefox sagt",[49,56,57],{},"Was es bedeutet",[49,59,60],{},"Was es behebt",[62,63,64,82,98,113],"tbody",{},[46,65,66,73,76,79],{},[67,68,69],"td",{},[70,71,72],"code",{},"NET::ERR_CERT_COMMON_NAME_INVALID",[67,74,75],{},"Das Zertifikat ist für deine Adresse nicht gültig",[67,77,78],{},"Es wurde für einen anderen Namen ausgestellt",[67,80,81],{},"Ein Zertifikat, das genau deine Adresse führt",[46,83,84,89,92,95],{},[67,85,86],{},[70,87,88],{},"NET::ERR_CERT_AUTHORITY_INVALID",[67,90,91],{},"Dem Zertifikat wird nicht vertraut, weil es selbstsigniert ist",[67,93,94],{},"Niemand bürgt dafür außer dem Server selbst",[67,96,97],{},"Ein Zertifikat von einer echten Zertifizierungsstelle",[46,99,100,104,107,110],{},[67,101,102],{},[70,103,88],{},[67,105,106],{},"Der Aussteller des Zertifikats ist unbekannt",[67,108,109],{},"Der Browser kann es mit keiner Stelle verbinden, der er vertraut",[67,111,112],{},"Die vollständige Kette, von einer anerkannten Stelle",[46,114,115,120,123,126],{},[67,116,117],{},[70,118,119],{},"NET::ERR_CERT_DATE_INVALID",[67,121,122],{},"Das Zertifikat ist abgelaufen",[67,124,125],{},"Das Datum",[67,127,128],{},[20,129,130],{"href":22},"Ein neues Zertifikat",[10,132,133],{},"Chrome zeigt für die zweite und dritte Zeile denselben Code, deshalb lohnt es\nsich, das Zertifikat selbst zu öffnen.",[10,135,136],{},"Wenn eine Person die Warnung meldet und sonst niemand sie sieht, frag, in welchem\nNetz sie war. Der Quellcode von Chrome nennt ein WLAN, das seine Nutzer auf eine\nAnmeldeseite umleitet, als eine Ursache des Namensfehlers. Die verschwindet,\nsobald sie sich im Netz anmeldet.",[26,138,140],{"id":139},"wie-sehe-ich-was-im-zertifikat-steht","Wie sehe ich, was im Zertifikat steht?",[10,142,143],{},"Öffne es aus der Warnung heraus und lies zwei Felder: für wen es ausgestellt\nwurde und wer es ausgestellt hat.",[10,145,146,147,151,152,155],{},"In Chrome klickst du auf den Warnhinweis links in der Adressleiste (",[148,149,150],"strong",{},"Not\nsecure"," in einem englischen Chrome) und öffnest das Zertifikat aus dem Fenster,\ndas erscheint. In Firefox klickst du in der Warnung auf ",[148,153,154],{},"Advanced"," und dann auf\nden Link zum Zertifikat der Website (so heißen sie in einem englischen Firefox).\nDie beiden Browser benennen dieselben Felder unterschiedlich:",[157,158,159,175],"ul",{},[160,161,162,163,166,167,170,171,174],"li",{},"Das Feld, für wen das Zertifikat ausgestellt wurde (",[148,164,165],{},"Issued To"," in einem\nenglischen Chrome, ",[148,168,169],{},"Subject Name"," in Firefox), nennt den Namen, für den es\ngemacht wurde. Die vollständige Liste der Namen, die es abdeckt, steht unter\n",[148,172,173],{},"Subject Alternative Name",", und diese Liste vergleicht der Browser mit der\nAdresse.",[160,176,177,178,181,182,185],{},"Das Feld, wer es ausgestellt hat (",[148,179,180],{},"Issued By"," in Chrome, ",[148,183,184],{},"Issuer Name"," in\nFirefox), nennt die Stelle, die es signiert hat.",[10,187,188],{},"Jede der drei Ursachen liest sich dort anders:",[157,190,191,194,197],{},[160,192,193],{},"Das Zertifikat nennt eine andere Adresse. Das ist Ursache 1.",[160,195,196],{},"Inhaber und Aussteller tragen denselben Namen. Es hat sich selbst signiert,\ndas ist Ursache 2.",[160,198,199],{},"Es nennt deine Adresse, der Aussteller ist eine Stelle, von der du gehört\nhast, und der Browser lehnt es trotzdem ab. Das ist Ursache 3, die Kette.",[26,201,203],{"id":202},"ursache-1-das-zertifikat-gilt-für-eine-andere-adresse","Ursache 1: Das Zertifikat gilt für eine andere Adresse",[10,205,206],{},"Das Zertifikat ist echt und gültig datiert, und es wurde für einen anderen Namen\nausgestellt. Es ist die Zulassung eines anderen Ladens, die in deinem Fenster\nhängt.",[10,208,209],{},"Es kommt in drei Formen vor:",[157,211,212,218,232],{},[160,213,214,217],{},[148,215,216],{},"Deine Domain zeigt auf einen Host, der noch kein Zertifikat für sie hat.","\nDer Host antwortet mit dem Zertifikat, das er hat, ausgestellt auf einen\neigenen Namen. Lovables Dokumentation sagt es klar: Bis das Zertifikat bereit\nist, zeigt der Browser statt deiner Seite eine Sicherheitswarnung.",[160,219,220,223,224,227,228,231],{},[148,221,222],{},"Das Zertifikat deckt eine Schreibweise deiner Adresse ab, und der Besucher\nhat die andere getippt."," ",[70,225,226],{},"www.yourapp.com"," und ",[70,229,230],{},"yourapp.com"," sind für ein\nZertifikat zwei Namen, und jeder muss auf seiner Liste stehen.",[160,233,234,237],{},[148,235,236],{},"Ein Teil deines DNS zeigt noch auf einen Ort, den du verlassen hast."," Ein\nalter Host oder die Parkseite, die dein Registrar zeigte, bevor du etwas\nverbunden hast, antwortet auf diesem Namen mit einem eigenen Zertifikat.",[239,240],"diagram",{"alt":241,"caption":242,"src":243},"Zwei Zeilen. In jeder steht eine Adressleiste mit yourapp.com neben einer Zertifikatskarte, die die abgedeckten Namen aufführt. Oben führt die Karte nur www.yourapp.com, und die Zeile endet mit einem Kreuz. Unten führt sie beide Namen, und die Zeile endet mit einem Haken.","Für ein Zertifikat sind die Adresse mit www und die ohne zwei Namen. Die Adresse in der Leiste muss auf der Liste stehen.","\u002Fblog\u002Fcertificate-not-trusted\u002Fone-name-missing-1600x660.png",[10,245,246],{},"Bei Lovable und Vercel kaufst und installierst du dieses Zertifikat nicht\nselbst. Der Host stellt eines für jeden Namen aus, den du in seinen\nDomain-Einstellungen hinzufügst, sobald dein DNS diesen Namen auf den Host\nrichtet. Lovables Dokumentation ergänzt, dass ein bei deinem Registrar gekauftes\nZertifikat von seinem Hosting überhaupt nicht verwendet wird. Füge beide\nSchreibweisen hinzu, richte beide auf den Host und warte, bis jede als live\nangezeigt wird.",[26,248,250],{"id":249},"ursache-2-das-zertifikat-hat-sich-selbst-signiert","Ursache 2: Das Zertifikat hat sich selbst signiert",[10,252,253],{},"Niemand bürgt für dieses Zertifikat außer dem Server, der es vorzeigt. Es ist\neine Zulassung, die der Ladenbesitzer zu Hause gedruckt hat.",[10,255,256],{},"Jeder Browser lehnt so eines auf einer öffentlichen Seite ab, und das soll er\nauch. Ein Kommentar im Quellcode von Chrome nennt den Grund in einer Zeile: Ein\nselbstsigniertes Zertifikat bietet keinen Schutz gegen einen Angreifer, der\nzwischen deinem Besucher und deiner App sitzt.",[10,258,259],{},"Du triffst es auf Servern, die jemand von Hand eingerichtet hat: ein gemieteter\nServer, ein selbst gehostetes Tool, eine Testeinstellung, die mit der App live\ngegangen ist. Ein Builder stellt echte Zertifikate für die Domains aus, die du\nbei ihm hinzufügst. Ein selbstsigniertes Zertifikat auf einer App, die ein\nBuilder hostet, heißt also, dass etwas anderes als der Builder auf deiner\nAdresse antwortet. Prüf, wohin dein DNS zeigt, bevor du irgendetwas anderes\nänderst.",[10,261,262],{},"Die Lösung ist ein Zertifikat von einer echten Zertifizierungsstelle. Let's\nEncrypt stellt sie kostenlos aus, und es ist die Stelle, die Vercel nutzt, wenn\nes deines ausstellt.",[26,264,266],{"id":265},"ursache-3-ein-glied-der-kette-wurde-nie-mitgeschickt","Ursache 3: Ein Glied der Kette wurde nie mitgeschickt",[10,268,269],{},"Das Zertifikat gilt für deine Adresse und wurde von einer echten Stelle\nsigniert, aber der Server hat es ohne das Zertifikat dazwischen geschickt, also\nkann der Browser es mit niemandem verbinden, dem er vertraut. Die Zulassung hat\neine Zweigstelle unterschrieben, und das Schreiben der Zentrale, das für diese\nZweigstelle bürgt, fehlt im Fenster.",[10,271,272],{},"Mozilla nennt ein fehlendes Zwischenzertifikat eines der häufigsten Probleme bei\nder Serverkonfiguration. Firefox lädt inzwischen vorab eine Kopie jedes\nvertrauenswürdigen Zwischenzertifikats herunter, damit seine Nutzer dem Fehler\nnicht mehr begegnen.",[10,274,275],{},"Das macht diese Ursache schwer zu sehen: Auf deinem Laptop kann alles gut\naussehen, während es bei jemand anderem scheitert. Ein Browser mit einer eigenen\nKopie des fehlenden Glieds füllt die Lücke. Software, die nur das verwendet, was\ndein Server schickt, hat nichts, womit sie sie füllen könnte. Unser Scanner ist\nso eine Software, und deshalb kann er ein Zertifikat als nicht vertrauenswürdig\nmelden, während dein eigener Browser ein Schloss zeigt.",[239,277],{"alt":278,"caption":279,"src":280},"Ein Server schickt ein Zertifikat an zwei Besucher. Zwischen dem Zertifikat und der vertrauenswürdigen Stelle sollte ein zweites Zertifikat stehen, und der Server hat es nicht geschickt. Der erste Besucher hat eine Kopie des fehlenden Zertifikats und bekommt einen Haken. Der zweite hat nichts und bekommt ein Kreuz.","Dieselbe unvollständige Kette, an zwei Besucher geschickt. Nur der, der das fehlende Glied schon hatte, kann sie vervollständigen.","\u002Fblog\u002Fcertificate-not-trusted\u002Fthe-missing-link-1600x700.png",[10,282,283,284,287,288,291,292,298],{},"Bei einem Builder wird die Kette für dich erledigt. Sie fehlt auf Servern, die\nvon Hand konfiguriert wurden, und die Lösung dort ist, das Zertifikat zusammen\nmit dem Zwischenzertifikat in einer Datei auszuliefern. Wenn du certbot von\nLet's Encrypt verwendest, ist das die Datei ",[70,285,286],{},"fullchain.pem",", und der Fehler\nbesteht darin, den Server stattdessen auf ",[70,289,290],{},"cert.pem"," zu richten. Zum Prüfen von\naußen meldet ",[20,293,297],{"href":294,"rel":295},"https:\u002F\u002Fwww.ssllabs.com\u002Fssltest\u002F",[296],"nofollow","der kostenlose Servertest von SSL Labs","\nein fehlendes Zwischenzertifikat als Problem der Kette.",[26,300,302],{"id":301},"der-fall-mit-der-eigenen-domain-der-reihe-nach","Der Fall mit der eigenen Domain, der Reihe nach",[10,304,305],{},"Wenn du deine eigene Domain mit einem Builder verbindest, sehen Besucher diese\nWarnung, bis der Host ein Zertifikat für deinen Namen hat, und die Warnung sagt\ndie Wahrheit. Sie endet von selbst, sobald das Zertifikat ausgestellt ist.",[10,307,308],{},"Die Reihenfolge bei Lovable:",[310,311,312,321,324,327],"ol",{},[160,313,314,315,317,318,320],{},"Füge die Domain in Lovable hinzu. Es richtet ",[70,316,230],{}," und\n",[70,319,226],{}," ein und führt sie getrennt auf.",[160,322,323],{},"Ändere die DNS-Einträge bei deinem Registrar auf die Werte, die Lovable dir\ngibt. Laut Lovable sind die meisten Änderungen innerhalb weniger Stunden\naktiv, und die Verbreitung kann bis zu 72 Stunden dauern.",[160,325,326],{},"Lovable prüft die Domain und stellt das Zertifikat aus. Vercel arbeitet\ngenauso: Es weist Let's Encrypt automatisch nach, dass der Name dir gehört,\nsolange die Domain auf Vercel zeigt.",[160,328,329,330,333],{},"Öffne die Seite, sobald die Domain als ",[148,331,332],{},"Live"," angezeigt wird. Das rät\nLovable selbst.",[239,335],{"alt":336,"caption":337,"src":338},"Eine Zeitleiste. Eine Figur richtet einen Namen auf einen Host, und von da an läuft eine gelbe Strecke mit Warnzeichen bis zu einem Siegel, das die Ausstellung des Zertifikats markiert. Danach wird die Linie zur Akzentfarbe mit einem Schloss. Eine Markierung weiter hinten trägt die Zahl 72.","Zwischen dem Umstellen deiner Domain auf den Host und dem Eintreffen des Zertifikats ist die Warnung korrekt. Lovable bittet dich, den Support zu kontaktieren, wenn sie nach 72 Stunden noch da ist.","\u002Fblog\u002Fcertificate-not-trusted\u002Fthe-wait-is-the-warning-1600x560.png",[10,340,341],{},"Wenn die Warnung nach 72 Stunden noch da ist, bittet Lovable dich, seinen\nSupport zu kontaktieren. Zwei Einstellungen solltest du vorher prüfen:",[157,343,344,354],{},[160,345,346,349,350,353],{},[148,347,348],{},"Such nach einem CAA-Eintrag."," Das ist ein DNS-Eintrag, der festlegt, welche\nStellen Zertifikate für deine Domain ausstellen dürfen. Einer, der die Stelle\ndeines Hosts auslässt, blockiert das Zertifikat, und eine Subdomain übernimmt\ndie CAA-Einträge der übergeordneten Domain, wenn sie keine eigenen hat.\n",[20,351,352],{"href":22},"Der Beitrag über den Ablauf"," begegnet\ndemselben Eintrag als Grund, warum eine Verlängerung scheitert. Hier\nverhindert er, dass das erste Zertifikat überhaupt ausgestellt wird.",[160,355,356,359],{},[148,357,358],{},"Such nach einem Proxy davor."," Liegt dein DNS bei Cloudflare und ist die\norange Wolke für die Einträge eingeschaltet, die dein Host dir gegeben hat,\nantwortet Cloudflare statt deines Hosts. Lovable sagt, dass es die Domain dann\nnicht prüfen und keine Zertifikate für sie ausstellen kann, und Lovable wie\nVercel sagen, diese Einträge auf DNS only zu stellen.",[26,361,363],{"id":362},"was-wir-bei-30879-apps-gefunden-haben","Was wir bei 30.879 Apps gefunden haben",[10,365,366],{},"Acht hatten ein Zertifikat, dem kein Browser vertrauen würde, und jede davon lief\nauf einer Domain, die ihr Besitzer verbunden hatte.",[10,368,369],{},"Im August 2026 hat unser Scan das Zertifikat von 30.879 Live-Apps gelesen:\n29.927 auf der eigenen Subdomain eines Builders und 952 auf einer eigenen\nDomain. Alle acht nicht vertrauenswürdigen Zertifikate waren unter den 952,\nknapp eines von hundert. Keine der Apps auf der Subdomain eines Builders hatte\neines, was zu allem oben passt. Auf der eigenen Adresse des Builders gehören dem\nBuilder sowohl der Name als auch das Zertifikat.",[10,371,372,373,376],{},"Unser Befund hält fest, dass das Zertifikat durchgefallen ist, aber nicht, welche\nder drei Ursachen es war, also können wir dir nicht sagen, wie sich die acht\naufteilen. Die abgelaufenen und bald ablaufenden Zertifikate aus demselben Scan\nsind im ",[20,374,375],{"href":22},"Beitrag über den Ablauf"," gezählt.",[10,378,379,380,384],{},"Um deine eigene App zu prüfen, liest ",[20,381,383],{"href":382},"\u002Fsecurity-scanner","unser kostenloser Scan","\ndas Zertifikat, das dein Server schickt, von außen und nennt diesen Befund, wenn\ner ihn sieht. Das dauert etwa 20 Sekunden und braucht kein Konto.",[26,386,388],{"id":387},"es-mitbekommen-wenn-sich-das-nächste-mal-etwas-ändert","Es mitbekommen, wenn sich das nächste Mal etwas ändert",[10,390,391],{},"Ein Zertifikat wird von vertrauenswürdig zu abgelehnt, wenn sich etwas um es\nherum ändert: eine neue Domain, ein DNS-Umzug, ein eingeschalteter Proxy. Die\nPrüfung, auf die es ankommt, ist die nach der Änderung.",[10,393,394,399],{},[148,395,396],{},[20,397,398],{"href":382},"Scanne deine App kostenlos",", um zu sehen, was der Browser\neines Besuchers heute bekommt.",[157,401,402,405,408],{},[160,403,404],{},"Liest das Zertifikat, das dein Server schickt, von außen, zusammen mit acht\nweiteren Prüfungen.",[160,406,407],{},"Nennt den Befund, wenn dem Zertifikat nicht vertraut wird, und wenn es\nabgelaufen ist oder bald abläuft.",[160,409,410],{},"Etwa 20 Sekunden, und kein Konto.",[10,412,413,419],{},[148,414,415],{},[20,416,418],{"href":417},"\u002Fwebsite-monitoring","Reeve Monitor",", um es bald nach der Änderung zu erfahren.",[157,421,422,425,428],{},[160,423,424],{},"Prüft deine App alle 60 Sekunden, und ein Zertifikat, dem es nicht vertrauen\nkann, zählt als Ausfall deiner App. Du erfährst es also wie bei jedem\nanderen Ausfall.",[160,426,427],{},"Führt alle neun Prüfungen jede Stunde erneut aus und schickt dir eine E-Mail,\nwenn deine Note sinkt.",[160,429,430],{},"Deckt bis zu drei Apps ab.",[26,432,434],{"id":433},"was-du-jetzt-tun-solltest","Was du jetzt tun solltest",[436,437,438],"key-takeaways",{},[157,439,440,443,446,454,457],{},[160,441,442],{},"Lies den Code unter der Warnung, bevor du irgendetwas verlängerst. Ein Datumsfehler braucht ein neues Zertifikat. Ein Namens- oder Ausstellerfehler braucht etwas anderes.",[160,444,445],{},"Öffne das Zertifikat und vergleiche den Namen, für den es ausgestellt wurde, mit der Adresse in der Leiste und mit dem Namen dessen, der es ausgestellt hat.",[160,447,448,449,227,451,453],{},"Bei einem Builder fügst du ",[70,450,230],{},[70,452,226],{}," in seinen Domain-Einstellungen hinzu und richtest beide auf ihn.",[160,455,456],{},"Zeigt eine neue Domain nach 72 Stunden noch die Warnung, such nach einem CAA-Eintrag oder einem Proxy vor dem Host, bevor du den Support kontaktierst.",[160,458,459],{},"Auf einem Server, den du selbst betreibst, liefere die vollständige Kette aus und prüf sie von außen mit SSL Labs.",[10,461,462,463,467],{},"Wenn die Warnung weg ist und die App trotzdem nicht lädt, ist die nächste Frage,\nob es an deiner App liegt oder an der Plattform darunter, und\n",[20,464,466],{"href":465},"\u002Fblog\u002Fis-supabase-down-or-your-app","ist Supabase ausgefallen oder deine App","\nzeigt, wie du das unterscheidest.",{"title":469,"searchDepth":470,"depth":470,"links":471},"",3,[472,474,475,476,477,478,479,480,481],{"id":28,"depth":473,"text":29},2,{"id":139,"depth":473,"text":140},{"id":202,"depth":473,"text":203},{"id":249,"depth":473,"text":250},{"id":265,"depth":473,"text":266},{"id":301,"depth":473,"text":302},{"id":362,"depth":473,"text":363},{"id":387,"depth":473,"text":388},{"id":433,"depth":473,"text":434},"Sicherheitsgrundlagen","\u002Fblog\u002Fcertificate-not-trusted\u002Fcover-1200x630.png","Zertifikatskarte mit Siegel und Datum in Akzentfarbe, darüber eine Adressleiste, deren Name länger ist als der gelbe Name auf der Karte.","Zertifikat nicht vertrauenswürdig, obwohl das Datum stimmt? Es nennt eine andere Adresse, hat sich selbst signiert oder seiner Kette fehlt ein Glied.",false,"md",[489,492,495,498,501],{"q":490,"a":491},"Warum sagt meine Website „nicht privat\", obwohl mein Zertifikat nicht abgelaufen ist?","Weil das Datum nur eine von drei Prüfungen ist, die ein Browser macht, und die anderen beiden für sich allein scheitern. Das Zertifikat muss außerdem genau die Adresse nennen, die der Besucher eingetippt hat, und von einer Stelle signiert sein, der der Browser vertraut, wobei jedes Zertifikat dazwischen mitgeschickt wird. Scheitert eine der beiden Prüfungen, kommt dieselbe ganzseitige Warnung wie bei einem abgelaufenen Zertifikat, und Verlängern ändert nichts.",{"q":493,"a":494},"Was ist ein Namenskonflikt beim Zertifikat?","Ein Zertifikat, das für eine Adresse ausgestellt wurde und auf einer anderen vorgezeigt wird. Chrome meldet es als NET::ERR_CERT_COMMON_NAME_INVALID, Firefox sagt, das Zertifikat sei für deine Adresse nicht gültig. Das Zertifikat selbst ist meist echt und gültig datiert. Es gehört nur zu einem anderen Namen, oft dem deines Hosts, und genau damit antwortet ein Host auf deiner Domain, bevor er eines für dich ausgestellt hat.",{"q":496,"a":497},"Warum funktioniert www und die Domain ohne www nicht?","Weil das für ein Zertifikat zwei verschiedene Namen sind. Entweder führt das Zertifikat nur einen davon, oder das DNS des anderen zeigt noch woandershin, etwa auf die Parkseite deines Registrars oder einen alten Host, der mit einem eigenen Zertifikat antwortet. Lovable verbindet beide und führt sie getrennt auf, also prüf, ob jede als live angezeigt wird.",{"q":499,"a":500},"Wie lange dauert ein Zertifikat für eine eigene Domain?","Laut Lovable ist die Einrichtung einer Domain meist in wenigen Minuten fertig, kann aber bis zu mehreren Stunden dauern. DNS-Änderungen können bis zu 72 Stunden brauchen, bis sie sich verbreitet haben, und wenn das Zertifikat nach 72 Stunden nicht ausgestellt ist, sollst du den Support kontaktieren. Bis es ausgestellt ist, sehen Besucher statt deiner Seite eine Sicherheitswarnung.",{"q":502,"a":503},"Ist ein selbstsigniertes Zertifikat jemals in Ordnung?","Auf deinem eigenen Rechner, zum Entwickeln, ja. Auf einer Seite, die die Öffentlichkeit besucht, nein. Jeder Browser deiner Besucher lehnt es ab, und ein Kommentar im Quellcode von Chrome hält fest, dass ein selbstsigniertes Zertifikat keinen Schutz gegen einen Angreifer bietet, der zwischen Besucher und Seite sitzt.","\u002Fblog\u002Fcertificate-not-trusted\u002Fcard-800x500.png",[506,507,508,509,510,511,512],"zertifikat nicht vertrauenswürdig","ssl zertifikat nicht vertrauenswürdig browser","verbindung nicht privat eigene domain","zertifikat name stimmt nicht überein","selbstsigniertes zertifikat warnung","net::err_cert_common_name_invalid","net::err_cert_authority_invalid",{},true,"\u002Fblog\u002Fcertificate-not-trusted","2026-10-26",{"title":5,"description":485},"blog\u002Fcertificate-not-trusted",[520,521,522],"Ein Zertifikat, dem Browser nicht vertrauen, kann völlig gültig datiert sein. Abgelehnt wird es, weil es eine andere Adresse nennt, weil es sich selbst signiert hat oder weil es ohne das Zertifikat ankam, das für es bürgt.","Der Warnbildschirm ist derselbe wie bei einem abgelaufenen Zertifikat, und Verlängern behebt keine der drei Ursachen. Der Code unter der Warnung sagt dir, welche du hast.","Bei Lovable und Vercel zeigt eine eigene Domain diese Warnung, bis ihr Zertifikat ausgestellt ist. Diese Wartezeit ist normal. Eine Warnung, die länger bleibt, heißt, dass etwas das Zertifikat aufhält.","QUOMQm-wZ52qaiSTO6xUWf-uKUJOerXwWo9657stGU8",[525,531,537,543,549,555,561,567,573,579,585,592,598,604,610,611,617,623,629,635,641,647,653,659,665,671,677,683,689,695,701,707,713,719,725,731,737,743,749,755,760,766,772,778,784,790,795,801,807,813,818,824,830,836,842,848,854,860,866,872,878,884,890,896,902,908,914,920,926,932,938,944,950,956,962,968,974,980,986,992,998,1004,1010,1016,1021,1027,1033,1039,1044,1050],{"path":526,"title":527,"description":528,"published":529,"category":482,"image":530,"draft":486},"\u002Fblog\u002Fmax-client-connections-reached","Supabase \"max client connections reached\" erklärt","Supabase \"max client connections reached\": Der Pooler hat keinen Platz für noch einen Client. Der Port in deinem Connection String setzt das Limit.","2026-11-09","\u002Fblog\u002Fmax-client-connections-reached\u002Fcard-800x500.png",{"path":532,"title":533,"description":534,"published":535,"category":482,"image":536,"draft":486},"\u002Fblog\u002Funsupported-provider-provider-is-not-enabled","Supabase-Fehler: \"Unsupported provider: provider is not enabled\"","\"Unsupported provider: provider is not enabled\" heißt: Google-Login ist in deinem Supabase-Projekt aus. Die Lösung, und was bei redirect_uri_mismatch hilft.","2026-11-08","\u002Fblog\u002Funsupported-provider-provider-is-not-enabled\u002Fcard-800x500.png",{"path":538,"title":539,"description":540,"published":541,"category":482,"image":542,"draft":486},"\u002Fblog\u002Fviolates-foreign-key-constraint","Supabase-Fehler \"violates foreign key constraint\" beim Einfügen","Supabase \"insert or update on table violates foreign key constraint\": Deine Zeile zeigt auf eine, die es nicht gibt. Welche, warum, und die Lösung.","2026-11-07","\u002Fblog\u002Fviolates-foreign-key-constraint\u002Fcard-800x500.png",{"path":544,"title":545,"description":546,"published":547,"category":482,"image":548,"draft":486},"\u002Fblog\u002Fnull-value-violates-not-null-constraint","Supabase-Fehler \"null value in column violates not-null constraint\"","Supabase \"null value in column violates not-null constraint\": Eine Pflichtspalte kam leer an. Woher die Null kommt, und die Lösung.","2026-11-06","\u002Fblog\u002Fnull-value-violates-not-null-constraint\u002Fcard-800x500.png",{"path":550,"title":551,"description":552,"published":553,"category":482,"image":554,"draft":486},"\u002Fblog\u002Fauth-session-missing","Supabase \"Auth session missing!\": wo die Sitzung geblieben ist","\"Auth session missing!\" heißt: supabase-js fand keine angemeldete Sitzung und fragte Supabase gar nicht erst. Wo die Sitzung blieb, und die Lösung je Fall.","2026-11-05","\u002Fblog\u002Fauth-session-missing\u002Fcard-800x500.png",{"path":556,"title":557,"description":558,"published":559,"category":482,"image":560,"draft":486},"\u002Fblog\u002Finvalid-claim-missing-sub-claim","Supabase \"invalid claim: missing sub claim\": niemand ist angemeldet","\"invalid claim: missing sub claim\" heißt: Supabase Auth bekam ein echtes Token ohne Nutzer darin, deinen Projektschlüssel statt einer Sitzung.","2026-11-04","\u002Fblog\u002Finvalid-claim-missing-sub-claim\u002Fcard-800x500.png",{"path":562,"title":563,"description":564,"published":565,"category":482,"image":566,"draft":486},"\u002Fblog\u002Ffailed-to-send-a-request-to-the-edge-function","\"Failed to send a request to the Edge Function\": der echte Grund","\"Failed to send a request to the Edge Function\" heißt: Der Browser hat keine lesbare Antwort bekommen. Seine Konsole sagt, warum, und ob deine Funktion lief.","2026-11-03","\u002Fblog\u002Ffailed-to-send-a-request-to-the-edge-function\u002Fcard-800x500.png",{"path":568,"title":569,"description":570,"published":571,"category":482,"image":572,"draft":486},"\u002Fblog\u002Fsupabase-auth-redirects-to-localhost","Warum Supabase-E-Mail-Links auf localhost:3000 weiterleiten","Leitet Supabase auf localhost:3000 um, ist die Site URL unverändert, oder deine Adresse fehlt in Redirect URLs. Die Lösung und der Platzhalter, den du meidest.","2026-11-02","\u002Fblog\u002Fsupabase-auth-redirects-to-localhost\u002Fcard-800x500.png",{"path":574,"title":575,"description":576,"published":577,"category":482,"image":578,"draft":486},"\u002Fblog\u002Femail-link-is-invalid-or-has-expired","Supabase \"Email link is invalid or has expired\" bei einem neuen Link","Bei einem Link von vor einer Minute heißt Supabases \"Email link is invalid or has expired\" meist: Ein Mailfilter hat ihn zuerst benutzt. Prüfen und beheben.","2026-11-01","\u002Fblog\u002Femail-link-is-invalid-or-has-expired\u002Fcard-800x500.png",{"path":580,"title":581,"description":582,"published":583,"category":482,"image":584,"draft":486},"\u002Fblog\u002Fcanceling-statement-due-to-statement-timeout","Supabase \"canceling statement due to statement timeout\" erklärt","Supabase \"canceling statement due to statement timeout\": Eine Abfrage lief länger als ihre Rolle darf, 3 Sekunden für Besucher. Prüf zuerst die RLS-Regel.","2026-10-31","\u002Fblog\u002Fcanceling-statement-due-to-statement-timeout\u002Fcard-800x500.png",{"path":586,"title":587,"description":588,"published":589,"category":590,"image":591,"draft":486},"\u002Fblog\u002Fdatabase-error-deleting-user","\"Database error deleting user\" in Supabase und was mitgelöscht wird","\"Database error deleting user\" in Supabase heißt: Deine Datenbank hat das Löschen abgelehnt. Der Grund steht im Log, die Lösung entscheidet, was mitgeht.","2026-10-30","Backups","\u002Fblog\u002Fdatabase-error-deleting-user\u002Fcard-800x500.png",{"path":593,"title":594,"description":595,"published":596,"category":482,"image":597,"draft":486},"\u002Fblog\u002Fstripe-webhook-no-signatures-found","\"No signatures found matching the expected signature\" bei Supabase","Ein Stripe-Webhook in einer Supabase Edge Function meldet \"No signatures found matching the expected signature\"? Zwei Ursachen. Prüfe weiter.","2026-10-29","\u002Fblog\u002Fstripe-webhook-no-signatures-found\u002Fcard-800x500.png",{"path":599,"title":600,"description":601,"published":602,"category":482,"image":603,"draft":486},"\u002Fblog\u002Fsupabase-invalid-login","\"Invalid login credentials\" in Supabase: die drei Ursachen","Supabase sagt \"Invalid login credentials\" bei falschem Passwort, unbekannter E-Mail und Google-Konto. So erkennst du, welcher Fall es ist.","2026-10-28","\u002Fblog\u002Fsupabase-invalid-login\u002Fcard-800x500.png",{"path":605,"title":606,"description":607,"published":608,"category":482,"image":609,"draft":486},"\u002Fblog\u002Fedge-function-returned-a-non-2xx-status-code","\"Edge Function returned a non-2xx status code\": der echte Fehler","\"Edge Function returned a non-2xx status code\" heißt: Deine Supabase-Funktion hat mit einem Fehler geantwortet. So liest du den echten.","2026-10-27","\u002Fblog\u002Fedge-function-returned-a-non-2xx-status-code\u002Fcard-800x500.png",{"path":515,"title":5,"description":485,"published":516,"category":482,"image":504,"draft":486},{"path":612,"title":613,"description":614,"published":615,"category":482,"image":616,"draft":486},"\u002Fblog\u002Finvalid-input-syntax-for-type-uuid","Supabase \"invalid input syntax for type uuid\": was im Zitat steht","Supabase \"invalid input syntax for type uuid\" heißt: Deine App hat etwas geschickt, das keine ID ist. Zitat lesen, Abfrage zurückhalten, Spalte behalten.","2026-10-25","\u002Fblog\u002Finvalid-input-syntax-for-type-uuid\u002Fcard-800x500.png",{"path":618,"title":619,"description":620,"published":621,"category":482,"image":622,"draft":486},"\u002Fblog\u002Fduplicate-key-value-violates-unique-constraint","Supabase \"duplicate key value violates unique constraint\" erklärt","Supabase \"duplicate key value violates unique constraint\" heißt: Der Wert ist schon vergeben. Spalte finden, Lösung wählen, Wert vom Bildschirm fernhalten.","2026-10-24","\u002Fblog\u002Fduplicate-key-value-violates-unique-constraint\u002Fcard-800x500.png",{"path":624,"title":625,"description":626,"published":627,"category":482,"image":628,"draft":486},"\u002Fblog\u002Fsupabase-relation-does-not-exist","Supabase \"relation does not exist\", obwohl die Tabelle da ist","Supabase \"relation does not exist\" oder PGRST205: Keine Tabelle passt zu Name und Schema deiner Abfrage. Vier Prüfungen, und was eine Freigabe öffnet.","2026-10-23","\u002Fblog\u002Fsupabase-relation-does-not-exist\u002Fcard-800x500.png",{"path":630,"title":631,"description":632,"published":633,"category":482,"image":634,"draft":486},"\u002Fblog\u002Fsupabase-function-not-found","Supabase PGRST202: \"Could not find the function in the schema cache\"","Supabase \"Could not find the function in the schema cache\" nennt die Argumente, die deine App geschickt hat. Vergleich sie mit der Funktion.","2026-10-22","\u002Fblog\u002Fsupabase-function-not-found\u002Fcard-800x500.png",{"path":636,"title":637,"description":638,"published":639,"category":482,"image":640,"draft":486},"\u002Fblog\u002Fsupabase-schema-cache-column-error","Supabase PGRST204: \"Could not find the column in the schema cache\"","Supabase \"Could not find the column in the schema cache\" heißt meist: Der Name passt nicht. Vier Prüfungen und der Einzeiler zum Neuladen.","2026-10-21","\u002Fblog\u002Fsupabase-schema-cache-column-error\u002Fcard-800x500.png",{"path":642,"title":643,"description":644,"published":645,"category":482,"image":646,"draft":486},"\u002Fblog\u002Fsupabase-email-rate-limit-exceeded","Supabase \"Email Rate Limit Exceeded\": zwei Limits, ein Fehlercode","Supabase \"Email Rate Limit Exceeded\" begrenzt jede E-Mail deines Projekts: 2 pro Stunde beim eingebauten Absender. Was zählt und wie du es anhebst.","2026-10-20","\u002Fblog\u002Fsupabase-email-rate-limit-exceeded\u002Fcard-800x500.png",{"path":648,"title":649,"description":650,"published":651,"category":482,"image":652,"draft":486},"\u002Fblog\u002Fsupabase-users-logged-out","Supabase \"Invalid Refresh Token: Refresh Token Not Found\": 3 Ursachen","Supabase \"Invalid Refresh Token: Refresh Token Not Found\" meldet deine Nutzer ab. Drei Ursachen, und wie das Auth-Log sie trennt.","2026-10-19","\u002Fblog\u002Fsupabase-users-logged-out\u002Fcard-800x500.png",{"path":654,"title":655,"description":656,"published":657,"category":482,"image":658,"draft":486},"\u002Fblog\u002Fpermission-denied-for-schema-public","Supabase \"permission denied for schema public\": drei Ursachen","Supabase \"permission denied for schema public\" heißt: Ein Grant auf das Schema fehlt. Was ihn entfernt hat und welche Zeile ihn zurückbringt.","2026-10-18","\u002Fblog\u002Fpermission-denied-for-schema-public\u002Fcard-800x500.png",{"path":660,"title":661,"description":662,"published":663,"category":482,"image":664,"draft":486},"\u002Fblog\u002Fsupabase-bucket-not-found","Supabase \"Bucket not found\": die drei Dinge, die es bedeutet","Supabase \"Bucket not found\" ist eins von drei Dingen: ein öffentlicher Link zu einem privaten Bucket, ein ungenauer Name oder das falsche Projekt.","2026-10-17","\u002Fblog\u002Fsupabase-bucket-not-found\u002Fcard-800x500.png",{"path":666,"title":667,"description":668,"published":669,"category":482,"image":670,"draft":486},"\u002Fblog\u002Fsupabase-invalid-jwt","Supabase invalid JWT: Welcher Schlüssel streikt hier?","Ein Supabase invalid JWT ist PGRST301: ein signiertes Token hat die Prüfung nicht bestanden. In neueren Projekten ist das die Sitzung, nicht der API-Schlüssel.","2026-10-16","\u002Fblog\u002Fsupabase-invalid-jwt\u002Fcard-800x500.png",{"path":672,"title":673,"description":674,"published":675,"category":482,"image":676,"draft":486},"\u002Fblog\u002Fsupabase-single-row-error","Supabase \"multiple (or no) rows returned\" heißt meist: keine Zeilen","Supabase gibt PGRST116 zurück, \"JSON object requested, multiple (or no) rows returned\", wenn die Abfrage nichts fand. Versteckte Zeilen wirken fehlend.","2026-10-15","\u002Fblog\u002Fsupabase-single-row-error\u002Fcard-800x500.png",{"path":678,"title":679,"description":680,"published":681,"category":482,"image":682,"draft":486},"\u002Fblog\u002Fdatabase-error-saving-new-user","\"Database error saving new user\" in Supabase: wo du nachsiehst","\"Database error saving new user\" heißt: etwas an deiner Supabase-Registrierung ist fehlgeschlagen. Der echte Fehler steht in deinen Logs.","2026-10-14","\u002Fblog\u002Fdatabase-error-saving-new-user\u002Fcard-800x500.png",{"path":684,"title":685,"description":686,"published":687,"category":482,"image":688,"draft":486},"\u002Fblog\u002Fwhat-is-supabase","Was ist Supabase? Die Datenbank, die dein Builder ausgesucht hat","Was ist Supabase: die Datenbank, der Login und der Dateispeicher hinter deiner App. Supabase betreibt die Server, die Regeln zu deinen Zeilen gehören dir.","2026-10-13","\u002Fblog\u002Fwhat-is-supabase\u002Fcard-800x500.png",{"path":690,"title":691,"description":692,"published":693,"category":482,"image":694,"draft":486},"\u002Fblog\u002Faws-access-key-exposed-in-frontend","Ein offengelegter AWS-Schlüssel im Frontend ist kein OpenAI-Key","Ein im Frontend offengelegter AWS-Zugriffsschlüssel liest und schreibt deinen Speicher. Die Lösung ist meist eine presigned URL, kein neuer Schlüssel.","2026-10-12","\u002Fblog\u002Faws-access-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":696,"title":697,"description":698,"published":699,"category":482,"image":700,"draft":486},"\u002Fblog\u002Fstorage-upload-violates-row-level-security","\"Row-level security policy for table objects\" beim Upload","\"New row violates row-level security policy for table objects\" heißt: Deinem Upload fehlt eine insert-Regel. Ein öffentlicher Bucket fügt keine hinzu.","2026-10-11","\u002Fblog\u002Fstorage-upload-violates-row-level-security\u002Fcard-800x500.png",{"path":702,"title":703,"description":704,"published":705,"category":482,"image":706,"draft":486},"\u002Fblog\u002Fbase44-security-scan","Base44 Security Scan: das, was nur er sehen kann","Der Base44 Security Scan prüft sieben Arten von Problemen von innen. Hier ist die Hälfte, die er liest und sonst niemand, und die Hälfte, die er nie ansieht.","2026-10-10","\u002Fblog\u002Fbase44-security-scan\u002Fcard-800x500.png",{"path":708,"title":709,"description":710,"published":711,"category":482,"image":712,"draft":486},"\u002Fblog\u002Fapi-key-leaked-what-to-do","Dein API-Key wurde geleakt. Die richtige Reihenfolge","Ein API-Key wurde geleakt und du weißt nicht, was zuerst zu tun ist. Nicht jeder Key im Frontend ist ein Leck, und die Reihenfolge zählt mehr als das Tempo.","2026-10-09","\u002Fblog\u002Fapi-key-leaked-what-to-do\u002Fcard-800x500.png",{"path":714,"title":715,"description":716,"published":717,"category":482,"image":718,"draft":486},"\u002Fblog\u002Finfinite-recursion-in-policy-for-relation","\"Infinite recursion detected in policy\" ohne RLS abzuschalten","\"Infinite recursion detected in policy for relation\" heißt: Deine Policy hat die Tabelle gefragt, die sie schützt. So brichst du den Kreis.","2026-10-08","\u002Fblog\u002Finfinite-recursion-in-policy-for-relation\u002Fcard-800x500.png",{"path":720,"title":721,"description":722,"published":723,"category":482,"image":724,"draft":486},"\u002Fblog\u002Fno-api-key-found-in-request","\"No API key found in request\" in Supabase, und die falsche Lösung","\"No API key found in request\" heißt, deine Supabase-Anfrage kam ohne Schlüssel an. Die meisten Antworten zeigen stattdessen auf deine Datenbankregeln.","2026-10-07","\u002Fblog\u002Fno-api-key-found-in-request\u002Fcard-800x500.png",{"path":726,"title":727,"description":728,"published":729,"category":482,"image":730,"draft":486},"\u002Fblog\u002Fis-base44-safe","Ist Base44 sicher? Was 5.442 echte Base44-Apps zeigten","Ist Base44 sicher? Wir haben 5.442 laufende Base44-Apps mit neun Checks geprüft. Fast alle bekamen ein B, aus Gründen, die der Inhaber nie gewählt hat.","2026-10-06","\u002Fblog\u002Fis-base44-safe\u002Fcard-800x500.png",{"path":732,"title":733,"description":734,"published":735,"category":482,"image":736,"draft":486},"\u002Fblog\u002Fmove-a-secret-to-an-edge-function","API-Schlüssel verstecken: ab in eine Supabase Edge Function","Einen API-Schlüssel verstecken heißt, ihn aus dem Browser zu nehmen. Eine Supabase Edge Function ist der kleinste Ort dafür, und zwei Schritte zählen mehr.","2026-10-05","\u002Fblog\u002Fmove-a-secret-to-an-edge-function\u002Fcard-800x500.png",{"path":738,"title":739,"description":740,"published":741,"category":482,"image":742,"draft":486},"\u002Fblog\u002Fenv-file-exposed-on-your-server","Ist deine .env-Datei öffentlich? Zwölf Pfade zum Prüfen","Ist deine .env-Datei auf deinem eigenen Webserver öffentlich? Zwölf Adressen sagen es dir, und ein Treffer heißt: alles darin ist längst öffentlich.","2026-10-04","\u002Fblog\u002Fenv-file-exposed-on-your-server\u002Fcard-800x500.png",{"path":744,"title":745,"description":746,"published":747,"category":482,"image":748,"draft":486},"\u002Fblog\u002Fis-v0-safe","v0-Sicherheit: alle 1.790 gescannten v0-Apps bekamen ein A","v0-Sicherheit, gemessen an 1.790 laufenden v0-Apps: Jede bekam ein A. Nur 17 nannten eine Datenbank, und genau das misst das A vor allem.","2026-10-03","\u002Fblog\u002Fis-v0-safe\u002Fcard-800x500.png",{"path":750,"title":751,"description":752,"published":753,"category":482,"image":754,"draft":486},"\u002Fblog\u002Fis-bolt-safe","Ist Bolt sicher? Was 1.123 echte Bolt-Apps zeigten","Ist Bolt sicher? Wir haben 1.123 laufende Bolt-Apps mit neun Checks geprüft. Das Hosting war sauber. Die Funde waren Schlüssel und offene Tabellen in den Apps.","2026-10-02","\u002Fblog\u002Fis-bolt-safe\u002Fcard-800x500.png",{"path":465,"title":756,"description":757,"published":758,"category":482,"image":759,"draft":486},"Ist Supabase down oder liegt es an deiner App? So erkennst du es","Ist Supabase down oder liegt es an deiner App? Ein pausiertes Projekt, eine volle Datenbank und ein eigener Fehler sehen gleich aus. Vier Prüfungen helfen.","2026-10-01","\u002Fblog\u002Fis-supabase-down-or-your-app\u002Fcard-800x500.png",{"path":761,"title":762,"description":763,"published":764,"category":482,"image":765,"draft":486},"\u002Fblog\u002Fdoes-supabase-encrypt-my-data","Verschlüsselt Supabase meine Daten? Ja. Wovor das schützt","Verschlüsselt Supabase Daten? Ja: AES-256 im Ruhezustand, TLS bei der Übertragung, SOC 2 und ISO 27001. Was jedes abdeckt und welches Leck keines stoppt.","2026-09-30","\u002Fblog\u002Fdoes-supabase-encrypt-my-data\u002Fcard-800x500.png",{"path":767,"title":768,"description":769,"published":770,"category":482,"image":771,"draft":486},"\u002Fblog\u002Fsupabase-free-plan-limits","Supabase Gratis-Tarif: die Limits und was an jedem passiert","Die Limits des Supabase-Gratis-Tarifs: 500 MB Datenbank, 5 GB Egress und keine Backups. Was an jeder Grenze passiert und was $25 für Pro ändern.","2026-09-29","\u002Fblog\u002Fsupabase-free-plan-limits\u002Fcard-800x500.png",{"path":773,"title":774,"description":775,"published":776,"category":590,"image":777,"draft":486},"\u002Fblog\u002Ftest-your-supabase-backup","Teste dein Supabase-Backup, bevor du es brauchst","So testest du dein Supabase-Backup: in ein Übungsprojekt einspielen, Zeilen zählen, anmelden und die Zeile suchen, die einer abgeschnittenen Datei fehlt.","2026-09-28","\u002Fblog\u002Ftest-your-supabase-backup\u002Fcard-800x500.png",{"path":779,"title":780,"description":781,"published":782,"category":590,"image":783,"draft":486},"\u002Fblog\u002Fsupabase-backup-github-action","Kostenloses Supabase-Backup per GitHub Action, mit Haken","Eine Supabase-Backup-GitHub-Action kostet nichts und passt für viele Apps. Der Workflow, der richtige Connection String und das Egress pro Lauf.","2026-09-27","\u002Fblog\u002Fsupabase-backup-github-action\u002Fcard-800x500.png",{"path":785,"title":786,"description":787,"published":788,"category":590,"image":789,"draft":486},"\u002Fblog\u002Fdownload-your-supabase-backup","Warum du dein Supabase-Backup nicht herunterladen kannst","Dein Supabase-Backup kannst du auf aktuellen Projekten nicht herunterladen, weil die Tageskopie physisch ist. Wie du es prüfst und selbst eine Kopie hältst.","2026-09-26","\u002Fblog\u002Fdownload-your-supabase-backup\u002Fcard-800x500.png",{"path":791,"title":792,"description":793,"published":788,"category":482,"image":794,"draft":486},"\u002Fblog\u002Fsupabase-permission-denied-for-table","Supabase \"permission denied for table\": der fehlende Grant","Ab 30. Oktober antwortet eine neue Supabase-Tabelle mit \"permission denied for table\", bis du Zugriff erteilst. Der Grant aus der E-Mail ist die halbe Lösung.","\u002Fblog\u002Fsupabase-permission-denied-for-table\u002Fcard-800x500.png",{"path":796,"title":797,"description":798,"published":799,"category":482,"image":800,"draft":486},"\u002Fblog\u002Fopen-api-endpoint-exposed","Ist ein offener API-Endpunkt ein Sicherheitsproblem? Sieh ins JSON","Dein Scan hat einen offenen API-Endpunkt gemeldet. Ob das zählt, hängt davon ab, was zurückkam, und die meisten hier gehörten der Plattform.","2026-09-25","\u002Fblog\u002Fopen-api-endpoint-exposed\u002Fcard-800x500.png",{"path":802,"title":803,"description":804,"published":805,"category":482,"image":806,"draft":486},"\u002Fblog\u002Flovable-security-scan","Lovable Security Scan: das Eine, was er nicht beweist","Lovable Security Scan: was Quick Scan und Deep Scan prüfen, wann welcher läuft, und das Eine, was kein Scan von innen beweisen kann.","2026-09-24","\u002Fblog\u002Flovable-security-scan\u002Fcard-800x500.png",{"path":808,"title":809,"description":810,"published":811,"category":590,"image":812,"draft":486},"\u002Fblog\u002Fsupabase-backup-auth-users","Warum in deinem Supabase-Dump keine Nutzer stehen","Führe supabase db dump allein aus und du bekommst die Form deiner Datenbank und keine einzige Zeile, und das auth-Schema mit deinen Nutzern fehlt ganz.","2026-09-23","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":22,"title":814,"description":815,"published":816,"category":482,"image":817,"draft":486},"Domain abgelaufen, Website offline: was jetzt passiert","Deine Domain ist abgelaufen und deine Website ist offline. Welche Frist jetzt läuft, warum das Zertifikat das kleinere Problem ist, und wie du beides prüfst.","2026-09-22","\u002Fblog\u002Fdomain-and-certificate-expiry\u002Fcard-800x500.png",{"path":819,"title":820,"description":821,"published":822,"category":482,"image":823,"draft":486},"\u002Fblog\u002Fis-lovable-safe","Ist Lovable sicher? Was 18.554 echte Lovable-Apps zeigten","Ist Lovable sicher? Wir haben 18.554 laufende Lovable-Apps mit neun Checks geprüft. Die Plattform war die sauberste von fünf. Die Funde saßen in den Apps.","2026-09-21","\u002Fblog\u002Fis-lovable-safe\u002Fcard-800x500.png",{"path":825,"title":826,"description":827,"published":828,"category":482,"image":829,"draft":486},"\u002Fblog\u002Fvibe-coded-app-security-checklist","Die Sicherheits-Checkliste für Vibe-Coding, in neun Prüfungen","Eine Sicherheits-Checkliste für Vibe-Coding mit neun Punkten, die jeder von außen an deiner Live-App nachprüfen kann, jeder mit einem Test in einer Zeile.","2026-09-20","\u002Fblog\u002Fvibe-coded-app-security-checklist\u002Fcard-800x500.png",{"path":831,"title":832,"description":833,"published":834,"category":482,"image":835,"draft":486},"\u002Fblog\u002Fstripe-secret-key-in-frontend","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.","2026-09-19","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Fcard-800x500.png",{"path":837,"title":838,"description":839,"published":840,"category":482,"image":841,"draft":486},"\u002Fblog\u002Fvite-and-next-public-env-vars","Vite-Env-Variablen offengelegt: der Präfix heißt veröffentlichen","Vite-Env-Variablen offengelegt: Deine App hat getan, was der Präfix verlangt. VITE_ und NEXT_PUBLIC_ heißen veröffentlichen, und die KI kannte den Preis nie.","2026-09-18","\u002Fblog\u002Fvite-and-next-public-env-vars\u002Fcard-800x500.png",{"path":843,"title":844,"description":845,"published":846,"category":482,"image":847,"draft":486},"\u002Fblog\u002Fbase44-source-maps","Base44-Sicherheit: was ein Scan meldet und was du ändern kannst","Base44-Sicherheit auf 5.438 gescannten Apps: Drei Befunde auf fast jeder gehören der Plattform, die Source Map ist das Base44-Badge, und deine Liste ist kurz.","2026-09-17","\u002Fblog\u002Fbase44-source-maps\u002Fcard-800x500.png",{"path":849,"title":850,"description":851,"published":852,"category":482,"image":853,"draft":486},"\u002Fblog\u002Fis-cursor-ai-safe","Ist Cursor AI sicher? Editor, Code und die App, die du veröffentlichst","Ist Cursor AI sicher? Drei Fragen in einer Suche: was Cursor behält, was sein Code falsch macht und ob deine veröffentlichte App offen steht.","2026-09-16","\u002Fblog\u002Fis-cursor-ai-safe\u002Fcard-800x500.png",{"path":855,"title":856,"description":857,"published":858,"category":482,"image":859,"draft":486},"\u002Fblog\u002Fis-replit-safe","Ist Replit sicher? Was wir in 3.042 Replit-Apps gefunden haben","Ist Replit sicher? Wir haben 3.042 laufende Replit-Apps mit neun externen Checks geprüft. Die Funde saßen in der veröffentlichten App, nicht im Hosting.","2026-09-15","\u002Fblog\u002Fis-replit-safe\u002Fcard-800x500.png",{"path":861,"title":862,"description":863,"published":864,"category":590,"image":865,"draft":486},"\u002Fblog\u002Fsupabase-storage-backup","Supabase Storage Backup: deine Datenbankkopie hat keine Dateien","Ein Supabase Storage Backup ist eine eigene Aufgabe. Datenbank-Backups enthalten die Liste deiner Dateien und keine davon, also bleibt jeder Upload kaputt.","2026-09-14","\u002Fblog\u002Fsupabase-storage-backup\u002Fcard-800x500.png",{"path":867,"title":868,"description":869,"published":870,"category":590,"image":871,"draft":486},"\u002Fblog\u002Fsupabase-point-in-time-recovery","Supabase Point-in-Time Recovery: Kosten und Grenzen","Supabase Point-in-Time Recovery spult deine Datenbank auf jede Sekunde der letzten Woche zurück. $100 im Monat zusätzlich zu Pro, und nur die Datenbank.","2026-09-13","\u002Fblog\u002Fsupabase-point-in-time-recovery\u002Fcard-800x500.png",{"path":873,"title":874,"description":875,"published":876,"category":590,"image":877,"draft":486},"\u002Fblog\u002Fsupabase-project-paused-recover","Supabase-Projekt pausiert? Deine Daten sind noch da","Supabase hat dein Projekt nach einer Woche ohne Aktivität pausiert. Gelöscht ist nichts, Wiederherstellen steht neben dem Namen, und du hast ein Jahr.","2026-09-12","\u002Fblog\u002Fsupabase-project-paused-recover\u002Fcard-800x500.png",{"path":879,"title":880,"description":881,"published":882,"category":482,"image":883,"draft":486},"\u002Fblog\u002Fsafest-ai-app-builder","Welcher KI-App-Builder ist am sichersten? 30.998 Apps im Test","Welcher KI-App-Builder ist am sichersten? Wir haben 30.998 aktive Apps von Lovable, Base44, Replit, v0 und Bolt gescannt. Der Builder entscheidet das nicht.","2026-09-11","\u002Fblog\u002Fsafest-ai-app-builder\u002Fcard-800x500.png",{"path":885,"title":886,"description":887,"published":888,"category":482,"image":889,"draft":486},"\u002Fblog\u002Fenable-rls-on-every-supabase-table","Row Level Security für jede Supabase-Tabelle aktivieren und prüfen","Row Level Security in Supabase ohne Policy sperrt eine Tabelle komplett. Eine Policy ohne den Schalter bringt gar nichts. Hier ist das SQL, und der Test.","2026-09-10","\u002Fblog\u002Fenable-rls-on-every-supabase-table\u002Fcard-800x500.png",{"path":891,"title":892,"description":893,"published":894,"category":482,"image":895,"draft":486},"\u002Fblog\u002Fsupabase-rls-disabled-in-public","Supabase \"RLS disabled in public\": was die Warnung übersieht","Supabase meldet \"RLS disabled in public\" als Fehler. Zur Lese-Policy, die deine Tabelle genauso offen lässt, sagt der Advisor gar nichts.","2026-09-09","\u002Fblog\u002Fsupabase-rls-disabled-in-public\u002Fcard-800x500.png",{"path":897,"title":898,"description":899,"published":900,"category":482,"image":901,"draft":486},"\u002Fblog\u002Frotate-supabase-service-role-key","Geleakten Supabase-service_role-Schlüssel richtig tauschen","Supabase sagt: erst das Leck schließen. Andere Anleitungen: sofort tauschen. Was richtig ist, hängt davon ab, wohin dein service_role-Schlüssel gelangt ist.","2026-09-08","\u002Fblog\u002Frotate-supabase-service-role-key\u002Fcard-800x500.png",{"path":903,"title":904,"description":905,"published":906,"category":482,"image":907,"draft":486},"\u002Fblog\u002Fvibe-coding-security-scanners-compared","Vibe-Coding-Security-Scanner im Vergleich, unserer eingeschlossen","Der beste Vibe-Coding-Security-Scanner hängt an drei Fragen, die keine Funktionsliste beantwortet. Acht Tools im Vergleich, mit Preisen und unseren Lücken.","2026-09-07","\u002Fblog\u002Fvibe-coding-security-scanners-compared\u002Fcard-800x500.png",{"path":909,"title":910,"description":911,"published":912,"category":482,"image":913,"draft":486},"\u002Fblog\u002Fsupabase-security-checker","Supabase Security Checker: die fünf Prüfungen selbst machen","Ein Supabase Security Checker liest deine veröffentlichte App statt deiner Projekteinstellungen. Hier sind die fünf Prüfungen und wie du jede selbst ausführst.","2026-09-06","\u002Fblog\u002Fsupabase-security-checker\u002Fcard-800x500.png",{"path":915,"title":916,"description":917,"published":918,"category":482,"image":919,"draft":486},"\u002Fblog\u002Fvibe-coding-security-scanner","Vibe-Coding-Security-Scanner: was ein URL-Scan übersieht","Ein Vibe-Coding-Security-Scanner liest deine laufende App von außen. Was das abdeckt, die vier Dinge, die er nicht sehen kann, und wie du das Ergebnis liest.","2026-09-05","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fcard-800x500.png",{"path":921,"title":922,"description":923,"published":924,"category":482,"image":925,"draft":486},"\u002Fblog\u002Fmissing-security-headers","Fehlende Sicherheitsheader: wann sie wirklich zählen","Fehlende Sicherheitsheader ist unser häufigster Befund. Wogegen sie schützen, und wann sie die unwichtigste Zeile in deinem Bericht sind.","2026-09-04","\u002Fblog\u002Fmissing-security-headers\u002Fcard-800x500.png",{"path":927,"title":928,"description":929,"published":930,"category":482,"image":931,"draft":486},"\u002Fblog\u002Fopenai-api-key-exposed-in-frontend","Dein OpenAI-API-Schlüssel liegt im Frontend. Tausch ihn aus.","Ein OpenAI-API-Schlüssel im Frontend lässt sich an keine Domain binden. Tausch ihn heute, leg den Aufruf hinter deinen Server und begrenze das Budget.","2026-09-03","\u002Fblog\u002Fopenai-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":933,"title":934,"description":935,"published":936,"category":482,"image":937,"draft":486},"\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps","API-Schlüssel im Frontend: was 30.998 Apps wirklich ausliefern","Ein API-Schlüssel im Frontend ist meistens ein Google-Maps-Schlüssel. Wir haben 30.998 aktive Vibe-Coding-Apps gescannt und gezählt, was wirklich austritt.","2026-09-02","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fcard-800x500.png",{"path":939,"title":940,"description":941,"published":942,"category":590,"image":943,"draft":486},"\u002Fblog\u002Fsupabase-backup-tools-compared","Supabase-Backup-Tools im Vergleich, unseres eingeschlossen","Vier Arten von Supabase-Backup-Tool, was jedes wirklich kopiert und wann eine kostenlose GitHub Action jeden Anbieter schlägt, uns eingeschlossen.","2026-09-01","\u002Fblog\u002Fsupabase-backup-tools-compared\u002Fcard-800x500.png",{"path":945,"title":946,"description":947,"published":948,"category":482,"image":949,"draft":486},"\u002Fblog\u002Freplit-secrets-explained","Secrets in Replit nutzen, und was trotzdem veröffentlicht wird","Secrets in Replit nutzen: anlegen, auslesen und die zwei Gründe beheben, warum undefined zurückkommt. Dazu die Schlüssel, die das Werkzeug nicht schützt.","2026-08-31","\u002Fblog\u002Freplit-secrets-explained\u002Fcard-800x500.png",{"path":951,"title":952,"description":953,"published":954,"category":590,"image":955,"draft":486},"\u002Fblog\u002Fback-up-supabase-free-tier","Supabase Gratis-Tarif: Backup ohne Terminal selbst machen","Im Supabase Gratis-Tarif gibt es keine Backups, die Kopie musst du selbst machen. Wie das im Dashboard geht und was der CSV-Weg auslässt.","2026-08-30","\u002Fblog\u002Fback-up-supabase-free-tier\u002Fcard-800x500.png",{"path":957,"title":958,"description":959,"published":960,"category":482,"image":961,"draft":486},"\u002Fblog\u002Fis-supabase-secure","Ist Supabase sicher? Ja. Dein Projekt ist eine eigene Frage","Ist Supabase sicher? Die Plattform ist auditiert, verschlüsselt und pentestet. Supabase schreibt selbst auf, wo das aufhört und deine Einstellungen anfangen.","2026-08-29","\u002Fblog\u002Fis-supabase-secure\u002Fcard-800x500.png",{"path":963,"title":964,"description":965,"published":966,"category":482,"image":967,"draft":486},"\u002Fblog\u002Fwhere-to-find-supabase-api-keys","Wo du deine Supabase API-Keys findest: anon, service_role, URL","Projekt-URL, anon-Schlüssel und service_role-Schlüssel liegen auf einer Seite im Dashboard. Wo sie ist, und welcher der vier Werte in deine App gehört.","2026-08-28","\u002Fblog\u002Fwhere-to-find-supabase-api-keys\u002Fcard-800x500.png",{"path":969,"title":970,"description":971,"published":972,"category":482,"image":973,"draft":486},"\u002Fblog\u002Fnew-row-violates-row-level-security-policy","New row violates row-level security policy in Supabase: was jetzt?","\"New row violates row-level security policy\" heißt, Supabase hat einen Schreibvorgang abgelehnt. Die schnelle Lösung öffnet die Tabelle wieder für alle.","2026-08-27","\u002Fblog\u002Fnew-row-violates-row-level-security-policy\u002Fcard-800x500.png",{"path":975,"title":976,"description":977,"published":978,"category":482,"image":979,"draft":486},"\u002Fblog\u002Fcors-wildcard-security-risk","Ist eine CORS-Wildcard ein Sicherheitsrisiko? Meist nicht.","Ist eine CORS-Wildcard ein Sicherheitsrisiko? Meist ist sie die Voreinstellung deines Builders und gibt nichts preis, was dein Server nicht ohnehin herausgab.","2026-08-26","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fcard-800x500.png",{"path":981,"title":982,"description":983,"published":984,"category":590,"image":985,"draft":486},"\u002Fblog\u002Fsupabase-branching-is-not-a-backup","Supabase Branching ist kein Backup. Es geht nur vorwärts.","Warum Supabase Branching kein Backup ist: Ein Branch startet ohne deine Daten, und ein Merge bringt nur das Schema. Wofür es gut ist und was stattdessen hilft.","2026-08-25","\u002Fblog\u002Fsupabase-branching-is-not-a-backup\u002Fcard-800x500.png",{"path":987,"title":988,"description":989,"published":990,"category":590,"image":991,"draft":486},"\u002Fblog\u002Fhow-to-restore-a-supabase-backup","Supabase-Backup wiederherstellen, und was danach kaputt ist","Wie du ein Supabase-Backup aus dem Dashboard oder aus einer Dump-Datei wiederherstellst, was ersetzt wird und warum die App danach kaputt sein kann.","2026-08-24","\u002Fblog\u002Fhow-to-restore-a-supabase-backup\u002Fcard-800x500.png",{"path":993,"title":994,"description":995,"published":996,"category":482,"image":997,"draft":486},"\u002Fblog\u002Fsupabase-storage-bucket-public","Dein Supabase-Storage-Bucket ist öffentlich. Ist das ein Problem?","Ein öffentlicher Supabase-Storage-Bucket heißt: Wer die URL einer Datei hat, kann sie öffnen. Er heißt nicht, dass jemand den Inhalt auflisten darf.","2026-08-23","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcard-800x500.png",{"path":999,"title":1000,"description":1001,"published":1002,"category":482,"image":1003,"draft":486},"\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend","Ist ein Google-API-Schlüssel im Frontend ein Problem?","Ein Google-API-Schlüssel im Frontend ist der Fund unseres Scanners Nummer eins, und meistens unbedenklich. Eine kostenlose Einstellung entscheidet darüber.","2026-08-22","\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":1005,"title":1006,"description":1007,"published":1008,"category":590,"image":1009,"draft":486},"\u002Fblog\u002Fai-agent-deleted-my-database","Ein KI-Agent hat meine Supabase-Daten gelöscht. Was hole ich zurück?","Ein KI-Agent hat Daten aus deiner Datenbank gelöscht. Was du zurückholst, stand schon vorher fest, und die nächsten Minuten entscheiden über den Rest.","2026-08-21","\u002Fblog\u002Fai-agent-deleted-my-database\u002Fcard-800x500.png",{"path":1011,"title":1012,"description":1013,"published":1014,"category":482,"image":1015,"draft":486},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","Kann jeder deine Supabase-Datenbank lesen? 3.680 Apps im Test","Kann jeder deine Supabase-Datenbank ohne Login lesen? Wir haben 30.998 aktive Apps aus KI-Buildern gescannt und gemessen, wie oft die Antwort ja lautet.","2026-08-18","\u002Fblog\u002Fcan-anyone-read-your-supabase-database\u002Fcard-800x500.png",{"path":1017,"title":1018,"description":1019,"published":1014,"category":482,"image":1020,"draft":486},"\u002Fblog\u002Fsource-maps-exposed-in-production","Source-Maps öffentlich: deine App veröffentlicht ihren Quellcode","Eine öffentliche Source-Map lässt jeden den Originalcode deiner App lesen, Kommentare inklusive. Der 30-Sekunden-Check, und was wirklich zählt.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fcard-800x500.png",{"path":1022,"title":1023,"description":1024,"published":1025,"category":482,"image":1026,"draft":486},"\u002Fblog\u002Fsupabase-new-api-keys","Supabase publishable key: ist er derselbe wie der anon key?","Supabase hat anon und service_role durch öffentliche und geheime Schlüssel ersetzt. Welcher gehört in deine App, und welcher nie?","2026-08-12","\u002Fblog\u002Fsupabase-new-api-keys\u002Fcard-800x500.png",{"path":1028,"title":1029,"description":1030,"published":1031,"category":590,"image":1032,"draft":486},"\u002Fblog\u002Fdoes-supabase-back-up-my-database","Sichert Supabase meine Datenbank? Das hängt von deinem Tarif ab.","Sichert Supabase deine Datenbank? Auf bezahlten Tarifen täglich, im Gratis-Tarif gar nicht. So findest du heraus, was du hast und was es nicht abdeckt.","2026-08-11","\u002Fblog\u002Fdoes-supabase-back-up-my-database\u002Fcard-800x500.png",{"path":1034,"title":1035,"description":1036,"published":1037,"category":482,"image":1038,"draft":486},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","Supabase Row Level Security ist an. Die Tabelle ist trotzdem offen.","Supabase Row Level Security anzuschalten schützt keine Tabelle. Erst deine Policies tun das, und die, die deine App repariert hat, lässt oft alle herein.","2026-08-10","\u002Fblog\u002Fsupabase-rls-on-but-table-still-public\u002Fcard-800x500.png",{"path":1040,"title":1041,"description":1042,"published":1037,"category":590,"image":1043,"draft":486},"\u002Fblog\u002Fversion-history-is-not-a-backup","Der Versionsverlauf ist kein Backup. Er holt keine Tabelle zurück.","Lovable und Bolt führen einen Versionsverlauf für deinen Code. Deine Datenbank ist ein eigener Dienst, und ein Rücksprung holt deine Daten nicht zurück.","\u002Fblog\u002Fversion-history-is-not-a-backup\u002Fcard-800x500.png",{"path":1045,"title":1046,"description":1047,"published":1048,"category":590,"image":1049,"draft":486},"\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database","Drei Wege, eine Supabase-Datenbank zu sichern, und was fehlt","Das Dashboard, pg_dump und ein verwalteter Dienst. Was jeder Weg wirklich sichert, was er stillschweigend auslässt und welcher den Kontoverlust übersteht.","2026-08-09","\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database\u002Fcard-800x500.png",{"path":1051,"title":1052,"description":1053,"published":1048,"category":482,"image":1054,"draft":486},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","Welche API-Schlüssel im Frontend sicher sind, und welche nicht","Dein Supabase-anon-Schlüssel darf öffentlich sein. Der service_role-Schlüssel nicht. Er ignoriert jede Regel, die du setzt. So erkennst du den Unterschied.","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend\u002Fcard-800x500.png",1794213638715]