[{"data":1,"prerenderedAt":350},["ShallowReactive",2],{"blog-de-supabase-storage-bucket-public":3},{"id":4,"title":5,"body":6,"category":308,"cover":309,"coverAlt":310,"description":311,"draft":312,"extension":313,"faq":314,"image":330,"keywords":331,"meta":338,"navigation":339,"ogTitle":340,"path":341,"published":342,"seo":343,"stem":344,"tldr":345,"updated":342,"__hash__":349},"blog_de\u002Fblog\u002Fsupabase-storage-bucket-public.md","Dein Supabase-Storage-Bucket ist öffentlich. Ist das ein Problem?",{"type":7,"value":8,"toc":297},"minimark",[9,13,16,24,29,32,35,38,41,45,48,110,113,116,122,126,129,141,151,154,157,171,175,178,193,196,201,204,211,215,218,224,233,236,240,243,246,249,252,256,284],[10,11,12],"p",{},"Jemand hat deine App geöffnet, eine Minute darin herumgestochert und dir eine\nNachricht geschickt: Dein Supabase-Storage-Bucket ist öffentlich, und jeder kann\nauflisten, was darin liegt.",[10,14,15],{},"Das sind zwei getrennte Aussagen. Die eine betrifft vermutlich eine Einstellung,\ndie du absichtlich gewählt hast und behalten solltest. Die andere ist einen\nNachmittag wert.",[10,17,18,19,23],{},"Hier ist der Punkt, den Anleitung um Anleitung falsch darstellt: ",[20,21,22],"strong",{},"öffentlich\nund auflistbar sind zwei verschiedene Schalter, und der beunruhigende ist nicht\nder, den dir alle umzulegen empfehlen."," Einen Bucket auf privat zu stellen\nschließt den ersten. Den zweiten kann es weit offen stehen lassen, und ein\nBucket, der nie in seinem Leben öffentlich war, kann heute Nachmittag auflistbar\nsein.",[25,26,28],"h2",{"id":27},"ist-ein-öffentlicher-supabase-storage-bucket-ein-sicherheitsproblem","Ist ein öffentlicher Supabase-Storage-Bucket ein Sicherheitsproblem?",[10,30,31],{},"Für sich genommen nein. Es bedeutet eine ganz bestimmte Sache, und die ist sehr\noft genau das, was du wolltest.",[10,33,34],{},"Einen Bucket öffentlich zu machen gibt jeder Datei darin eine URL, die ohne\nLogin funktioniert. Das ist die ganze Funktion. So lädt der Avatar unter einem\nKommentar für jemanden ohne Konto, so erscheint dein Logo in einer E-Mail, so\nsieht ein Produktfoto, wer noch überlegt, ob er sich anmeldet.",[10,36,37],{},"Ein öffentlicher Bucket ähnelt eher einer nicht eingetragenen Telefonnummer als\neiner unverschlossenen Tür. Die Leitung verbindet jeden, der wählt, und es gibt\nkein Verzeichnis, in dem die Nummer steht. Ob das in Ordnung ist, hängt an einer\nFrage: wie leicht jemand auf die Nummer kommt, ohne sie genannt bekommen zu\nhaben.",[10,39,40],{},"Supabase legt neue Buckets privat an und setzt eine Warnung an den Schalter. Ein\nöffentlicher Bucket ist also etwas, das jemand eingeschaltet hat: du, oder dein\nBuilder, um eine Upload-Funktion zum Laufen zu bringen.",[25,42,44],{"id":43},"was-der-schalter-öffentlich-tatsächlich-einschaltet","Was der Schalter „öffentlich\" tatsächlich einschaltet",[10,46,47],{},"Eine Zeile der Tabelle unten, und sonst nichts darin.",[49,50,51,67],"table",{},[52,53,54],"thead",{},[55,56,57,61,64],"tr",{},[58,59,60],"th",{},"Was jemand versucht",[58,62,63],{},"Öffentlicher Bucket",[58,65,66],{},"Privater Bucket",[68,69,70,82,92,101],"tbody",{},[55,71,72,76,79],{},[73,74,75],"td",{},"Eine Datei öffnen, deren genaue URL vorliegt",[73,77,78],{},"Funktioniert, ohne Login",[73,80,81],{},"Braucht eine Richtlinie oder einen signierten Link",[55,83,84,87,90],{},[73,85,86],{},"Den Inhalt des Buckets auflisten lassen",[73,88,89],{},"Nur wenn eine Richtlinie es erlaubt",[73,91,89],{},[55,93,94,97,99],{},[73,95,96],{},"Eine Datei hochladen",[73,98,89],{},[73,100,89],{},[55,102,103,106,108],{},[73,104,105],{},"Eine Datei löschen oder ersetzen",[73,107,89],{},[73,109,89],{},[10,111,112],{},"Die eigene Hilfeseite von Supabase sagt es so klar, wie es sich sagen lässt: Ein\nöffentlicher Bucket bedeutet, dass es eine öffentliche URL gibt, über die sich\ndie Datei herunterladen lässt, und jeder andere Vorgang muss weiterhin die\nRichtlinien dieses Buckets erfüllen.",[10,114,115],{},"Der Schalter ist also eine kleinere Kontrolle, als sein Name vermuten lässt.\nDrei dieser vier Zeilen werden ganz woanders entschieden, unter Storage →\nPolicies, und die Nachricht, die du bekommen hast, betraf mit ziemlicher\nSicherheit die zweite.",[117,118],"diagram",{"alt":119,"caption":120,"src":121},"Vier Buckets nebeneinander. Jeder hat einen Schalter für öffentlich, aus oder an, und ein Richtlinienfeld, das entweder leer oder gefüllt ist. Die beiden Buckets, deren Richtlinienfeld eine Bedingung mit nur dem Bucket-Namen enthält, zeigen alle sechs Dateien hell und mit Kreuz, gleich wie der Schalter steht. Die beiden mit leerem oder engem Feld zeigen nichts und tragen ein Häkchen.","Der Schalter oben ändert eine Sache. Das Feld darunter entscheidet, ob ein Fremder die Liste bekommt, und es tut das gleich, ob der Bucket öffentlich oder privat ist.","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fpublic-and-listable-1600x760.png",[25,123,125],{"id":124},"warum-ein-privater-bucket-trotzdem-auflistbar-sein-kann","Warum ein privater Bucket trotzdem auflistbar sein kann",[10,127,128],{},"Weil das Auflisten von einer Zugriffsrichtlinie erlaubt wird, und die\nRichtlinie, die die meisten einfügen, erlaubt es allen.",[10,130,131,132,136,137,140],{},"Jeder Lesezugriff auf Storage läuft über Row Level Security an einer Tabelle\nnamens ",[133,134,135],"code",{},"storage.objects",". Einen Bucket aufzulisten ist ein Lesezugriff, abgelegt\nunter ",[133,138,139],{},"SELECT",", genau wie das Herunterladen einer Datei. Der eigene\nSchnelleinstieg von Supabase zeigt eine Richtlinie in dieser Form, aus der die\nKopien meist stammen:",[142,143,149],"pre",{"className":144,"code":146,"language":147,"meta":148},[145],"language-sql","create policy \"Public Access\"\n  on storage.objects for select\n  using ( bucket_id = 'public' );\n","sql","",[133,150,146],{"__ignoreMap":148},[10,152,153],{},"Lies, was da steht. Jede beliebige Anfrage darf alles in diesem Bucket lesen.\nSie fragt nicht, wer fragt, und sie fragt nicht, ob die Datei überhaupt etwas\nmit dem Fragenden zu tun hat. Lesen umfasst das Herunterladen einer Datei, und\nes umfasst das Herausgeben der Dateiliste, denn das ist dieselbe Berechtigung\nmit zwei Hüten.",[10,155,156],{},"Der Schalter des Buckets kommt dabei nie ins Spiel. Eine solche Richtlinie auf\neinem privaten Bucket macht den Bucket auflistbar, und das Dashboard nennt ihn\nweiterhin wahrheitsgemäß privat.",[10,158,159,160,165,166,170],{},"Das Wort, das den Schaden anrichtet, ist „jede\". Eine Anfrage mit dem\nöffentlichen Schlüssel, der im Code deiner App mitgeliefert wird, erfüllt diese\nRichtlinie mühelos, und\n",[161,162,164],"a",{"href":163},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","dieser Schlüssel soll für alle lesbar sein",",\nweshalb genau die Richtlinie die Arbeit übernehmen soll. Das ist dieselbe Form\nwie beim Problem nebenan, wo\n",[161,167,169],{"href":168},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","Row Level Security eingeschaltet ist und trotzdem alles durchlässt",".",[25,172,174],{"id":173},"was-jemand-aus-einer-liste-deiner-dateien-gewinnt","Was jemand aus einer Liste deiner Dateien gewinnt",[10,176,177],{},"Namen, vor allem. Und das ist deutlich mehr, als es klingt.",[10,179,180,181,184,185,188,189,192],{},"Dateinamen beschreiben meist ihren Inhalt, weil jemand sie gewählt hat, während\ner an das Innere dachte: ",[133,182,183],{},"rechnung-maerz-acme.pdf",", ",[133,186,187],{},"reisepass-vorne.jpg",",\n",[133,190,191],{},"lohn-final-v2.xlsx",". Eine Liste davon ist eine brauchbare Zusammenfassung\ndeines Geschäfts, und ihre Länge sagt ungefähr, wie viele Kunden du hast. Ist\nder Bucket zusätzlich öffentlich, ist jeder Name auf dieser Liste ein\nfunktionierender Link.",[10,194,195],{},"Zurück zur Telefonnummer. Nicht eingetragen zu sein ist etwas wert, bis das\nVerzeichnis erscheint, und danach war es nie wichtig, wie schwer die Nummer zu\nerraten war.",[117,197],{"alt":198,"caption":199,"src":200},"Zwei Hälften. Links erreicht eine Anfrage an den öffentlichen Objektpfad eine von acht Dateien; die anderen sieben sind als gestrichelte Umrisse gezeichnet, die die Anfrage nie findet. Rechts liefert eine Anfrage an den Listenpfad alle acht als volle Zeilen zurück.","Ohne Auflisten muss ein Fremder irgendwie auf einen Dateinamen kommen. Mit Auflisten bekommt er jeden Dateinamen, den du hast.","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fguess-or-list-1600x700.png",[10,202,203],{},"So zeigt es sich im Alltag: Ein Dokument, das einem Kunden gehört, taucht vor\neinem anderen auf. Jemand nennt dir den Namen einer Datei, den er nicht wissen\nkonnte. Ein Ordner mit Uploads wird komplett kopiert, von einem automatischen\nCrawler, der jedes Supabase-Projekt durchging, das er finden konnte.",[10,205,206,207,170],{},"Unser kostenloser Scan fragt deinen Storage nach einer Auflistung, mit nichts\naußer dem Schlüssel, der ohnehin im Code deiner App steht, und sagt dir, welche\nBuckets mit Inhalt geantwortet haben. Er liest Namen und lädt nie eine Datei\nherunter. Er dauert etwa 20 Sekunden und braucht kein Konto:\n",[161,208,210],{"href":209},"\u002F#scan","App scannen",[25,212,214],{"id":213},"woran-du-erkennst-welchen-fall-du-hast","Woran du erkennst, welchen Fall du hast",[10,216,217],{},"Zwei Prüfungen im Supabase-Dashboard, und die zweite betrifft das, worum es in\nder Nachricht wirklich ging.",[10,219,220,223],{},[20,221,222],{},"Storage → Buckets."," Die öffentlichen sind als öffentlich gekennzeichnet. Frag\ndich bei jedem, ob wirklich jede einzelne Datei darin etwas ist, das du einem\nFremden zeigen würdest. Nicht die meisten Dateien. Jede, auch das, was nächste\nWoche von einer Funktion dort landet, die du noch nicht gebaut hast.",[10,225,226,229,230,232],{},[20,227,228],{},"Storage → Policies."," Lies jede ",[133,231,139],{},"-Richtlinie, die den Bucket betrifft.\nEine Bedingung, die nur den Namen des Buckets nennt, lässt jeden darin lesen.\nEine Bedingung, die den Eigentümer der Datei mit dem Anfragenden vergleicht, tut\nechte Arbeit. Eine leere Richtlinienliste auf einem privaten Bucket heißt, dass\nüberhaupt nichts gelesen wird, und das ist streng und sicher.",[10,234,235],{},"Muss deine App eine private Datei der richtigen Person zeigen, ist das Werkzeug\ndafür ein signierter Link: Dein Server holt sich von Supabase eine URL, die eine\nfestgelegte Zahl von Minuten funktioniert und danach nicht mehr. Damit bleibt\ndie Datei privat und kommt trotzdem auf die Seite.",[25,237,239],{"id":238},"wann-öffentlich-die-richtige-antwort-ist","Wann öffentlich die richtige Antwort ist",[10,241,242],{},"Häufiger, als ein Sicherheitsartikel üblicherweise zugibt, und das gehört\ngesagt.",[10,244,245],{},"Ist die Datei für alle gedacht, ist öffentlich richtig, und ein Umweg darum\nbringt dir eine langsamere App und mehr Code zu pflegen. Avatare, Logos,\nTitelbilder, alles, was ein abgemeldeter Besucher sehen soll: ab in einen\nöffentlichen Bucket, und dann nicht mehr daran denken.",[10,247,248],{},"Das Einzige, was auch dort zu tun ist, ist das Auflisten auszulassen. Ein\nöffentlicher Bucket voller Avatare ist eine Funktion. Derselbe Bucket, der die\nvollständige Liste aller herausgibt, die je einen hochgeladen haben, ist etwas\nanderes, das du nicht bestellt hast.",[10,250,251],{},"Gehört die Datei einer bestimmten Person, kommt sie in einen privaten Bucket mit\neiner Richtlinie, die prüft, wer fragt, und erreicht die Seite über einen\nsignierten Link. Der Test ist eine einzige Frage: Für wen ist diese Datei? Für\nalle, oder für ein bestimmtes Konto.",[25,253,255],{"id":254},"was-diese-woche-zu-tun-ist","Was diese Woche zu tun ist",[257,258,259],"key-takeaways",{},[260,261,262,266,275,278,281],"ul",{},[263,264,265],"li",{},"Öffne Storage → Buckets und schreib auf, welche öffentlich sind. Entscheide bei jedem, ob er Dateien für alle enthält oder Dateien für eine einzelne Person.",[263,267,268,269,271,272,274],{},"Lies jede ",[133,270,139],{},"-Richtlinie auf ",[133,273,135],{},". Eine Bedingung, die nur den Bucket nennt, gibt die Dateiliste an jeden heraus; genau die hat die Nachricht wahr gemacht, die du bekommen hast.",[263,276,277],{},"Verschiebe alles, was einer einzelnen Person gehört, in einen privaten Bucket und liefere es über signierte Links aus, die von selbst ablaufen.",[263,279,280],{},"Hör auf, hochgeladene Dateien nach ihrem Inhalt zu benennen. Eine zufällige Kennung kostet nichts und sorgt dafür, dass eine abgeflossene Liste viel weniger preisgibt.",[263,282,283],{},"Sichere deinen Storage getrennt von deiner Datenbank. Deine Uploads stecken weder in deinem Code noch in deinen Postgres-Tabellen, also kopiert nichts, was diese beiden kopiert, auch deine Dateien.",[10,285,286,287,291,292,296],{},"Öffne Storage → Policies in deinem Projekt und lies, was dort steht, bevor du\neinen einzigen Schalter umlegst. Dieser eine Bildschirm entscheidet, ob die\nzweite Hälfte deiner Nachricht zutraf. Die\n",[161,288,290],{"href":289},"\u002Fchecklist","10-Minuten-Sicherheits-Checkliste"," deckt das neben dem Rest ab, was\neine frisch gestartete App offen zu lassen pflegt, und falls ein Bucket\ntatsächlich lesbar war, ist\n",[161,293,295],{"href":294},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","was ein Fremder in deiner Datenbank erreicht","\ndas Nächste, denn die Richtlinie, die eine Dateiliste herausgibt, hat dieselbe\nForm wie die, die eine Tabelle herausgibt.",{"title":148,"searchDepth":298,"depth":298,"links":299},3,[300,302,303,304,305,306,307],{"id":27,"depth":301,"text":28},2,{"id":43,"depth":301,"text":44},{"id":124,"depth":301,"text":125},{"id":173,"depth":301,"text":174},{"id":213,"depth":301,"text":214},{"id":238,"depth":301,"text":239},{"id":254,"depth":301,"text":255},"Sicherheitsgrundlagen","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcover-1200x630.png","Dokumente in einem Behälter. Ein Balken deckt den größten Teil der Öffnung ab und endet vorzeitig, vier Dokumente stehen in der Lücke.","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.",false,"md",[315,318,321,324,327],{"q":316,"a":317},"Jemand sagt, mein Supabase-Storage-Bucket sei öffentlich. Soll ich ihn privat machen?","Nicht bevor du weißt, was darin liegt. Öffentliche Buckets haben ihren Grund: Profilbilder, Logos, Produktfotos und alles andere, was deine App einem nicht angemeldeten Besucher zeigt. Für solche Dateien ist öffentlich die richtige Einstellung. Für Rechnungen, Ausweisdokumente, Exporte oder alles, was einer bestimmten Person gehört, ist sie die falsche, und privat plus signierte Links ist dann das Richtige. Die Frage war nie, ob öffentlich schlecht ist. Sie lautet, ob genau diese Dateien für jeden gedacht waren, der danach fragt.",{"q":319,"a":320},"Was ist der Unterschied zwischen einem öffentlichen und einem auflistbaren Bucket?","Öffentlich entscheidet, ob sich eine Datei für jemanden öffnet, der ihre URL bereits hat. Auflistbar entscheidet, ob ein Fremder dein Projekt nach dem gesamten Inhalt eines Buckets fragen kann und eine Antwort bekommt. Beides wird an verschiedenen Stellen im Supabase-Dashboard eingestellt, und das Zweite macht aus einem Raten ein Verzeichnis.",{"q":322,"a":323},"Kann jemand die URLs der Dateien in meinem öffentlichen Bucket erraten?","Das hängt ganz davon ab, wie deine App sie benennt. Lädt sie unter dem ursprünglichen Dateinamen hoch oder unter etwas Geordnetem wie rechnung-4.pdf, dann ja, und es kostet sehr wenig Mühe. Lädt sie unter einer langen zufälligen Kennung hoch, ist Raten unpraktikabel. Genau deshalb wiegt das Auflisten so schwer: Es entfernt den Schritt des Ratens vollständig.",{"q":325,"a":326},"Wie verhindere ich, dass jemand meinen Bucket auflistet?","Das Auflisten läuft über eine Row-Level-Security-Richtlinie an der Tabelle storage.objects, dort wird es also behoben und nicht am Bucket selbst. Öffne Storage → Policies in deinem Supabase-Dashboard und lies jede SELECT-Richtlinie, die den Bucket betrifft. Eine, deren einzige Bedingung der Name des Buckets ist, lässt jede Anfrage darin lesen, die Dateiliste eingeschlossen. Verenge sie so, dass sie die Datei mit der fragenden Person vergleicht, oder entferne sie und gib stattdessen signierte Links von deinem Server aus.",{"q":328,"a":329},"Sind meine hochgeladenen Dateien in meinem Datenbank-Backup enthalten?","Nein. Storage liegt außerhalb deiner Postgres-Datenbank, ein Datenbank-Backup enthält also die Zeilen, die auf deine Dateien zeigen, und keine der Dateien selbst. Es zurückzuspielen gibt dir eine Tabelle voller Verweise auf Dinge, die nicht mehr da sind. Deine Uploads müssen getrennt kopiert werden, und die meisten erfahren das an dem Tag, an dem es darauf ankommt.","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcard-800x500.png",[332,333,334,335,336,337],"supabase storage bucket öffentlich","supabase bucket sicherheit","supabase storage richtlinie","dateien in supabase bucket auflisten","supabase bucket privat machen","supabase signierte url",{},true,"Ist ein öffentlicher Supabase-Bucket ein Problem?","\u002Fblog\u002Fsupabase-storage-bucket-public","2026-08-23",{"title":5,"description":311},"blog\u002Fsupabase-storage-bucket-public",[346,347,348],"Ein öffentlicher Supabase-Storage-Bucket bedeutet eine Sache: Wer die URL einer Datei hat, kann sie ohne Login öffnen. Über das, was sonst noch darin liegt, sagt er nichts.","Das Auflisten erlaubt eine Zugriffsrichtlinie und nicht der Schalter, also kann ein privater Bucket auflistbar sein und ein öffentlicher nicht.","Das Auflisten ist das, was heute zu beheben ist, denn es erspart einem Fremden das Raten eines einzigen Dateinamens.","zfeGf4xQ-eD5YY1hNssT06hYhK0NOhdcZ_ZX-9nh-hA",1787826048205]