[{"data":1,"prerenderedAt":350},["ShallowReactive",2],{"blog-es-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_es\u002Fblog\u002Fsupabase-storage-bucket-public.md","Tu bucket de Supabase Storage es público. ¿Es un problema?",{"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",{},"Alguien abrió tu aplicación, estuvo un minuto hurgando en ella y te mandó un\nmensaje: tu bucket de Supabase Storage es público y cualquiera puede listar lo\nque hay dentro.",[10,14,15],{},"Son dos afirmaciones distintas. Una de ellas es, probablemente, un ajuste que\nelegiste a propósito y que deberías conservar. La otra merece una tarde.",[10,17,18,19,23],{},"Aquí está la parte que guía tras guía cuenta mal: ",[20,21,22],"strong",{},"público y listable son dos\ninterruptores distintos, y el alarmante no es el que todo el mundo te dice que\ncambies."," Poner un bucket en privado cierra el primero. Puede dejar el segundo\nabierto de par en par, y un bucket que no ha sido público en su vida puede ser\nlistable esta misma tarde.",[25,26,28],"h2",{"id":27},"es-un-problema-de-seguridad-un-bucket-público-de-supabase-storage","¿Es un problema de seguridad un bucket público de Supabase Storage?",[10,30,31],{},"Por sí solo, no. Significa una cosa muy concreta, y esa cosa es muy a menudo la\nque querías.",[10,33,34],{},"Marcar un bucket como público le da a cada archivo que hay dentro una URL que\nfunciona sin iniciar sesión. Esa es toda la función. Así carga el avatar de un\ncomentario para quien no tiene cuenta, así aparece tu logotipo en un correo, así\nve la foto de un producto quien todavía está decidiendo si se registra.",[10,36,37],{},"Un bucket público se parece más a un número de teléfono que no está en la guía\nque a una puerta sin cerrar. La línea conecta con cualquiera que marque, y no\nhay ningún listín donde buscarlo. Que eso esté bien depende de una sola\npregunta: con qué facilidad llegaría alguien a ese número sin que nadie se lo\ndiera.",[10,39,40],{},"Supabase crea los buckets nuevos en privado y pone un aviso junto al\ninterruptor. Un bucket público es, por tanto, algo que alguien encendió: tú, o\ntu builder, para que funcionase una función de subida.",[25,42,44],{"id":43},"qué-enciende-realmente-el-interruptor-de-público","Qué enciende realmente el interruptor de público",[10,46,47],{},"Una fila de la tabla de abajo, y nada más de ella.",[49,50,51,67],"table",{},[52,53,54],"thead",{},[55,56,57,61,64],"tr",{},[58,59,60],"th",{},"Lo que alguien intenta",[58,62,63],{},"Bucket público",[58,65,66],{},"Bucket privado",[68,69,70,82,92,101],"tbody",{},[55,71,72,76,79],{},[73,74,75],"td",{},"Abrir un archivo cuya URL exacta ya tiene",[73,77,78],{},"Funciona, sin iniciar sesión",[73,80,81],{},"Necesita una política o un enlace firmado",[55,83,84,87,90],{},[73,85,86],{},"Pedir la lista del contenido del bucket",[73,88,89],{},"Solo si una política lo permite",[73,91,89],{},[55,93,94,97,99],{},[73,95,96],{},"Subir un archivo",[73,98,89],{},[73,100,89],{},[55,102,103,106,108],{},[73,104,105],{},"Borrar o reemplazar un archivo",[73,107,89],{},[73,109,89],{},[10,111,112],{},"La propia página de ayuda de Supabase lo dice con toda la claridad posible: un\nbucket público significa que existe una URL pública con la que descargar el\narchivo, y cualquier otra operación sigue teniendo que cumplir las políticas de\nese bucket.",[10,114,115],{},"Así que el interruptor es un control más pequeño de lo que sugiere su nombre.\nTres de esas cuatro filas se deciden en otro sitio completamente distinto, en\nStorage → Policies, y el mensaje que recibiste iba casi con seguridad sobre la\nsegunda.",[117,118],"diagram",{"alt":119,"caption":120,"src":121},"Cuatro buckets uno al lado del otro. Cada uno tiene un interruptor de público, apagado o encendido, y una caja de política vacía o llena. Los dos buckets cuya caja contiene una condición que solo nombra el bucket muestran sus seis archivos encendidos y con un aspa, esté como esté el interruptor. Los dos de caja vacía o estrecha no muestran nada y llevan una marca de visto.","El interruptor de arriba cambia una cosa. La caja de debajo decide si un desconocido recibe la lista, y lo hace igual tanto si el bucket es público como si es privado.","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fpublic-and-listable-1600x760.png",[25,123,125],{"id":124},"por-qué-un-bucket-privado-puede-seguir-siendo-listable","Por qué un bucket privado puede seguir siendo listable",[10,127,128],{},"Porque listar lo concede una política de acceso, y la política que casi todo el\nmundo pega se lo concede a todos.",[10,130,131,132,136,137,140],{},"Toda lectura de Storage pasa por Row Level Security en una tabla llamada\n",[133,134,135],"code",{},"storage.objects",". Listar un bucket es una lectura, archivada bajo ",[133,138,139],{},"SELECT",",\nigual que descargar un archivo. La propia guía rápida de Supabase enseña una\npolítica con esta forma, que es de donde suelen salir las copias:",[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],{},"Lee lo que dice. Cualquier petición puede leer cualquier cosa de ese bucket. No\npregunta quién pregunta, y no pregunta si el archivo tiene algo que ver con\nquien lo pide. Leer incluye descargar un archivo, e incluye entregar la lista de\narchivos, porque son el mismo permiso con dos sombreros.",[10,155,156],{},"El interruptor del propio bucket no entra nunca en la ecuación. Una política así\nsobre un bucket privado lo vuelve listable, y el panel seguirá describiéndolo,\ncon toda razón, como privado.",[10,158,159,160,165,166,170],{},"La palabra que hace el daño es «cualquiera». Una petición que lleve la clave\npublicable que viaja dentro del código de tu aplicación cumple esa política sin\nesfuerzo, y\n",[161,162,164],"a",{"href":163},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","esa clave está pensada para que la lea todo el mundo",",\nque es justo por lo que se supone que la política es la parte que trabaja. Es la\nmisma forma que el problema de al lado, donde\n",[161,167,169],{"href":168},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","Row Level Security está encendida y aun así lo permite todo",".",[25,172,174],{"id":173},"qué-saca-alguien-de-una-lista-de-tus-archivos","Qué saca alguien de una lista de tus archivos",[10,176,177],{},"Nombres, sobre todo. Que es bastante más de lo que suena.",[10,179,180,181,184,185,188,189,192],{},"Los nombres de archivo suelen describir su contenido, porque alguien los eligió\npensando en lo que había dentro: ",[133,182,183],{},"factura-marzo-acme.pdf",",\n",[133,186,187],{},"pasaporte-frente.jpg",", ",[133,190,191],{},"nomina-final-v2.xlsx",". Una lista de esos es un resumen\nrazonable de tu negocio, y su longitud dice más o menos cuántos clientes tienes.\nSi además el bucket es público, cada nombre de esa lista es un enlace que\nfunciona.",[10,194,195],{},"Volvamos al número de teléfono. No estar en la guía vale algo justo hasta que se\npublica el listín, y después nunca importó lo difícil que fuera adivinar el\nnúmero.",[117,197],{"alt":198,"caption":199,"src":200},"Dos mitades. A la izquierda, una petición a la ruta pública de objetos alcanza uno de ocho archivos; los otros siete están dibujados como contornos discontinuos que la petición nunca encuentra. A la derecha, una petición a la ruta de listado devuelve los ocho como filas sólidas.","Sin listado, un desconocido tiene que llegar a un nombre de archivo de alguna manera. Con él, le entregan todos los nombres que tienes.","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fguess-or-list-1600x700.png",[10,202,203],{},"La forma en que esto aflora es de lo más corriente. Un documento de un cliente\naparece delante de otro. Alguien te repite el nombre de un archivo que no tenía\nmanera de conocer. Una carpeta de subidas se copia entera, por un rastreador\nautomático que iba leyendo todos los proyectos de Supabase que encontraba.",[10,205,206,207,170],{},"Nuestro escaneo gratuito le pide un listado a tu Storage usando nada más que la\nclave que ya está en el código de tu aplicación, y te dice qué buckets\nrespondieron con contenido. Lee nombres y nunca descarga un archivo. Tarda unos\n20 segundos y no necesita cuenta: ",[161,208,210],{"href":209},"\u002F#scan","escanea tu aplicación",[25,212,214],{"id":213},"cómo-saber-cuál-de-los-dos-casos-tienes","Cómo saber cuál de los dos casos tienes",[10,216,217],{},"Dos comprobaciones en el panel de Supabase, y la segunda es de lo que iba de\nverdad el mensaje.",[10,219,220,223],{},[20,221,222],{},"Storage → Buckets."," Los públicos están marcados como públicos. Pregúntate por\ncada uno si absolutamente todos los archivos que contiene son algo que le\nenseñarías a un desconocido. No la mayoría de los archivos. Todos, incluido lo\nque aterrice ahí la semana que viene desde una función que aún no has creado.",[10,225,226,229,230,232],{},[20,227,228],{},"Storage → Policies."," Lee cada política ",[133,231,139],{}," que toque el bucket. Una\ncondición que solo menciona el nombre del bucket deja que cualquiera lo lea. Una\ncondición que compara al dueño del archivo con quien hace la petición está\nhaciendo trabajo de verdad. Una lista de políticas vacía sobre un bucket privado\nsignifica que no se lee nada en absoluto, y eso es restrictivo y seguro.",[10,234,235],{},"Si tu aplicación tiene que enseñarle un archivo privado a la persona correcta,\nla herramienta para eso es un enlace firmado: tu servidor le pide a Supabase una\nURL que funciona durante un número fijo de minutos y luego deja de funcionar. Así\nel archivo sigue siendo privado y aun así llega a la página.",[25,237,239],{"id":238},"cuándo-público-es-la-respuesta-correcta","Cuándo público es la respuesta correcta",[10,241,242],{},"Más a menudo de lo que un artículo de seguridad suele admitir, y conviene\ndecirlo.",[10,244,245],{},"Si el archivo es para todo el mundo, público es lo correcto, y dar un rodeo te\ncompra una aplicación más lenta y más código que mantener. Avatares, logotipos,\nimágenes de portada, cualquier cosa que deba ver alguien sin sesión iniciada: a\nun bucket público, y a dejar de pensar en ello.",[10,247,248],{},"Lo único que hay que hacer incluso ahí es dejar el listado apagado. Un bucket\npúblico lleno de avatares es una función. El mismo bucket entregando la lista\ncompleta de todos los que han subido uno alguna vez es otra cosa, y no la\npediste.",[10,250,251],{},"Si el archivo pertenece a una persona concreta, va a un bucket privado con una\npolítica que comprueba quién pregunta, y llega a la página por un enlace\nfirmado. La prueba es una sola pregunta: ¿para quién es este archivo? Para todos,\no para una cuenta con nombre y apellidos.",[25,253,255],{"id":254},"qué-hacer-esta-semana","Qué hacer esta semana",[257,258,259],"key-takeaways",{},[260,261,262,266,275,278,281],"ul",{},[263,264,265],"li",{},"Abre Storage → Buckets y apunta cuáles son públicos. Decide en cada uno si guarda archivos para todo el mundo o archivos para una sola persona.",[263,267,268,269,271,272,274],{},"Lee cada política ",[133,270,139],{}," sobre ",[133,273,135],{},". Una condición que solo nombra el bucket entrega la lista de archivos a cualquiera; esa es la que hizo verdadero el mensaje que recibiste.",[263,276,277],{},"Mueve todo lo que pertenezca a un único usuario a un bucket privado y sírvelo por enlaces firmados, que caducan solos.",[263,279,280],{},"Deja de nombrar los archivos subidos según su contenido. Un identificador aleatorio no cuesta nada y hace que una lista filtrada entregue mucho menos de lo que habría entregado.",[263,282,283],{},"Haz copia de tu Storage aparte de la de tu base de datos. Tus archivos subidos no están ni en tu código ni en tus tablas de Postgres, así que nada de lo que copie esos dos está copiando tus archivos.",[10,285,286,287,291,292,296],{},"Abre Storage → Policies en tu proyecto y lee lo que hay ahí antes de tocar un\nsolo interruptor. Esa única pantalla es la que decide si la segunda mitad del\nmensaje que recibiste era cierta. La\n",[161,288,290],{"href":289},"\u002Fchecklist","lista de seguridad de 10 minutos"," lo cubre junto al resto de lo que\nuna aplicación recién lanzada suele dejar abierto, y si un bucket resultó ser\nlegible,\n",[161,293,295],{"href":294},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","qué alcanza un desconocido en tu base de datos","\nes lo siguiente que leer, ya que la política que entrega una lista de archivos\ntiene la misma forma que la que entrega una tabla.",{"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},"Fundamentos de seguridad","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcover-1200x630.png","Documentos dentro de un contenedor. Una barra cubre casi toda la abertura y se corta antes de terminar, dejando cuatro de ellos en el hueco.","Un bucket público de Supabase Storage significa que quien tenga la URL de un archivo puede abrirlo. No significa que alguien pueda listar lo que hay dentro.",false,"md",[315,318,321,324,327],{"q":316,"a":317},"Me dicen que mi bucket de Supabase Storage es público. ¿Debo hacerlo privado?","No hasta que sepas qué hay dentro. Los buckets públicos existen por una razón: fotos de perfil, logotipos, imágenes de producto y cualquier otra cosa que tu aplicación muestre a alguien que no ha iniciado sesión. Para esos archivos, público es el ajuste correcto. Para facturas, documentos de identidad, exportaciones o cualquier cosa que pertenezca a una persona concreta, es el equivocado, y lo que quieres entonces es privado más enlaces firmados. La pregunta nunca fue si público es malo. Es si esos archivos en concreto estaban pensados para que los viera cualquiera que preguntase.",{"q":319,"a":320},"¿Cuál es la diferencia entre un bucket público y uno listable?","Público decide si un archivo se abre para alguien que ya tiene su URL. Listable decide si un desconocido puede pedirle a tu proyecto el contenido entero de un bucket y recibir una respuesta. Se configuran en sitios distintos del panel de Supabase, y el segundo es el que convierte una conjetura en un directorio.",{"q":322,"a":323},"¿Puede alguien adivinar las URL de los archivos de mi bucket público?","Depende por completo de cómo los nombre tu aplicación. Si los sube con el nombre original, o con algo ordenado como factura-4.pdf, entonces sí, y cuesta muy poco esfuerzo. Si los sube con un identificador largo y aleatorio, adivinar deja de ser práctico. Por eso mismo pesa tanto listar: elimina el paso de adivinar por completo.",{"q":325,"a":326},"¿Cómo impido que la gente liste mi bucket?","Listar pasa por una política de Row Level Security sobre la tabla storage.objects, así que ahí es donde se arregla y no en el bucket. Abre Storage → Policies en tu panel de Supabase y lee cada política SELECT que toque el bucket. Una cuya única condición sea el nombre del bucket deja que cualquier petición lo lea, incluida su lista de archivos. Estréchala para que compare el archivo con quien lo pide, o quítala y reparte enlaces firmados desde tu servidor.",{"q":328,"a":329},"¿Mi copia de seguridad de la base de datos incluye los archivos subidos?","No. Storage vive fuera de tu base de datos Postgres, así que una copia de la base contiene las filas que apuntan a tus archivos y ninguno de los archivos. Restaurarla te devuelve una tabla llena de enlaces a cosas que ya no están. Tus archivos subidos hay que copiarlos aparte, y la mayoría de la gente se entera el día en que importa.","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcard-800x500.png",[332,333,334,335,336,337],"bucket de supabase storage público","seguridad bucket público supabase","política de acceso supabase storage","listar archivos bucket supabase","hacer privado un bucket de supabase","url firmada supabase",{},true,"¿Es un problema un bucket público de Supabase?","\u002Fblog\u002Fsupabase-storage-bucket-public","2026-08-23",{"title":5,"description":311},"blog\u002Fsupabase-storage-bucket-public",[346,347,348],"Un bucket público de Supabase Storage significa una sola cosa: quien tenga la URL de un archivo puede abrirlo sin iniciar sesión. No dice nada sobre si puede ver qué más hay dentro.","Listar lo concede una política de acceso y no el interruptor de público, así que un bucket privado puede ser listable y uno público puede no serlo.","Listar es lo que hay que arreglar hoy, porque le ahorra a un desconocido el trabajo de adivinar un solo nombre de archivo.","SBy6QDrjygc1aMNzN0C_FhBjoA9aq0cVebQIVuNIUzY",1787826048205]