[{"data":1,"prerenderedAt":377},["ShallowReactive",2],{"blog-uk-can-anyone-read-your-supabase-database":3},{"id":4,"title":5,"body":6,"category":337,"cover":338,"coverAlt":338,"description":339,"draft":340,"extension":341,"faq":342,"image":358,"keywords":359,"meta":365,"navigation":366,"ogTitle":367,"path":368,"published":369,"seo":370,"stem":371,"tldr":372,"updated":369,"__hash__":376},"blog_uk\u002Fblog\u002Fcan-anyone-read-your-supabase-database.md","Чи може будь-хто прочитати вашу базу Supabase? 3 680 застосунків",{"type":7,"value":8,"toc":325},"minimark",[9,13,20,23,26,31,34,43,46,49,53,56,116,122,125,131,137,148,152,155,160,185,192,200,204,207,210,218,222,225,232,236,239,245,251,260,264,298,301,306,313],[10,11,12],"p",{},"У вашому застосунку є екран входу. За ним стоять ваші користувачі, їхні\nповідомлення, можливо, їхні замовлення. Виглядає приватно, і немає очевидного\nспособу дізнатися, чи це справді так, бо консоль Supabase не є тим місцем, куди\nвам колись треба було заходити.",[10,14,15,16],{},"Тож ми пішли виміряти це на чужих застосунках. У серпні 2026 року ми\nпросканували 30 998 живих застосунків, опублікованих із Lovable, Base44,\nReplit, v0 і Bolt, і поставили кожному одне запитання: ",[17,18,19],"strong",{},"чи може будь-хто\nпрочитати вашу базу даних Supabase без входу?",[10,21,22],{},"Для 2 096 із 3 680 застосунків, де ми отримали чітку відповідь, вона була «так».",[10,24,25],{},"І ось те, що хибно переказують і тривожна версія цієї історії, і заспокійлива.\nВідкрита таблиця не означає автоматично витік: безліч таблиць і створено, щоб їх\nчитали всі. Яка саме це таблиця, вирішує все, і відповісти може лише той, хто\nбудував застосунок. Через це ніхто цього й не помічає: застосунок працює\nбездоганно в обох випадках.",[27,28,30],"h2",{"id":29},"чи-може-будь-хто-прочитати-вашу-базу-даних-supabase","Чи може будь-хто прочитати вашу базу даних Supabase?",[10,32,33],{},"Для більш ніж половини застосунків, які ми змогли перевірити, відповідь була «так»:\nпринаймні одна таблиця повернула рядки на запит, що не ніс жодного входу.",[10,35,36,37,42],{},"Те, що це взагалі можливо, не має нічого спільного з чимось зламаним. Ваш\nзастосунок говорить із Supabase із браузера відвідувача, тож несе ключ, який\nпрочитає кожен відвідувач, і цей ключ\n",[38,39,41],"a",{"href":40},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","має бути публічним",". Він\nназиває ваш проєкт. Сам собою він не дає нічого.",[10,44,45],{},"Чи дістанеться стороннім ваших даних, вирішує Row Level Security: правило на\nкожній таблиці про те, хто які рядки може читати. Без правила ключ лишається\nєдиним, що стоїть між інтернетом і цією таблицею, а ключ написано у вашій сторінці.",[10,47,48],{},"Саме це ми й вимірювали. Не чи видно ключ (його видно завжди), а що робить\nбаза даних, коли ним хтось скористається.",[27,50,52],{"id":51},"часткою-чого-є-ці-57","Часткою чого є ці 57 %",[10,54,55],{},"Часткою бази, яку ми звузили тричі, і це звуження важить більше за заголовок.",[57,58,59,72],"table",{},[60,61,62],"thead",{},[63,64,65,69],"tr",{},[66,67,68],"th",{},"Що ми рахували",[66,70,71],{},"Застосунки",[73,74,75,84,92,100,108],"tbody",{},[63,76,77,81],{},[78,79,80],"td",{},"Живі застосунки, скановані та класифіковані",[78,82,83],{},"30 998",[63,85,86,89],{},[78,87,88],{},"Називають проєкт Supabase у сторінці",[78,90,91],{},"8 435",[63,93,94,97],{},[78,95,96],{},"Таблицю підтверджено й отримано відповідь",[78,98,99],{},"3 680",[63,101,102,105],{},[78,103,104],{},"Принаймні одна таблиця читається без входу",[78,106,107],{},"2 096",[63,109,110,113],{},[78,111,112],{},"…і одна з них мала назву про людей",[78,114,115],{},"394",[117,118],"diagram",{"alt":119,"caption":120,"src":121},"Чотири смуги, виміряні від одного й того самого загального числа, кожна вужча за попередню: 30 998 сканованих застосунків, 8 435 із Supabase, 3 680 із завершеною перевіркою, 2 096 із таблицею, яку читає будь-хто. Права колонка показує 27 %, 44 % і 57 %, частку кожного кроку від кроку вище.","Кожну смугу виміряно від одного загального числа. 57 % становлять частку тих 3 680 застосунків, які ми справді змогли перевірити, а не всіх сканованих.","\u002Fblog\u002Fcan-anyone-read-your-supabase-database\u002Fwhat-we-measured-1600x700.png",[10,123,124],{},"Три речі, яких ми не робили. Кожна зсуває справжнє число в той чи інший бік, і\nпро неї варто сказати, а не сховати.",[10,126,127,130],{},[17,128,129],{},"Ми питали лише про назви таблиць, які могли побачити або вгадати."," Supabase\nбільше не дозволяє публічному ключу перелічити таблиці проєкту, тож ми читали\nназви, які застосунок згадує у власному коді, і додавали зо два десятки\nзвичайних, не більш ніж тридцять на застосунок. Застосунок, чиї таблиці названо\nтак, як нам не спало на думку, виглядає для нас чистим і може таким не бути.",[10,132,133,136],{},[17,134,135],{},"Ми рахували рядки, а не читали їх."," Кожна проба питала базу, скільки рядків\nвона віддала б, і на цьому спинялася. Нічиїх даних не завантажено, і жоден\nзастосунок не названо ні в цій статті, ні деінде в тому, що ми публікуємо.",[10,138,139,142,143,147],{},[17,140,141],{},"Майже всі застосунки, які ми змогли перевірити, були з Lovable."," Вони\nстановлять найбільшу частку того, що ми сканували, і найчастіше називають свій проєкт\nSupabase у сторінці, тож читайте це як вимірювання\n",[38,144,146],{"href":145},"\u002Fis-your-lovable-app-safe","застосунків Lovable із Supabase",", а не кожного\nбілдера. Там, де перевірка не дійшла до кінця, ми так і записували. Застосунок,\nякий ми не змогли перевірити, лишається невідомим, а не чистим.",[27,149,151],{"id":150},"відкрита-таблиця-не-означає-автоматично-діру","Відкрита таблиця не означає автоматично діру",[10,153,154],{},"Ззовні таблиця, яку читає будь-хто, виглядає однаково і з вашим каталогом\nтоварів, і з вашими клієнтами. Відповідь та сама. Різниться тільки назва.",[117,156],{"alt":157,"caption":158,"src":159},"Два однакові шляхи запиту, намальовані один над одним. Обидва надсилають назву таблиці, обидва отримують відповідь 200 і обидва повертають п'ять рядків. Верхній шлях підписано products і він завершується зеленою галочкою; нижній підписано profiles і він завершується червоним хрестиком.","Той самий запит, та сама відповідь, протилежні вироки. Лише той, хто будував застосунок, знає, до якого з двох випадків належить його відкрита таблиця.","\u002Fblog\u002Fcan-anyone-read-your-supabase-database\u002Fsame-answer-different-table-1600x600.png",[10,161,162,163,167,168,171,172,171,175,171,178,171,181,184],{},"Тому ми ділимо знахідку надвоє. У 394 із цих застосунків одна з читаних таблиць\nмала назву з короткого переліку, який для нас означає людей: ",[164,165,166],"code",{},"users",",\n",[164,169,170],{},"profiles",", ",[164,173,174],{},"customers",[164,176,177],{},"orders",[164,179,180],{},"messages",[164,182,183],{},"invoices",". Це сторонній, який\nчитає ваших клієнтів, і це виправляють сьогодні.",[10,186,187,188,191],{},"Решту 1 702 ми не можемо оцінити ззовні, і жоден інший сканер теж не може.\nТаблиця ",[164,189,190],{},"posts"," може бути публічним блогом, а може бути приватними нотатками. Ви\nзнаєте, чим саме. Ніхто, хто дивиться на ваш застосунок з інтернету, не знає.",[10,193,194,195,199],{},"Якщо не хочете гадати про свій, наше безкоштовне сканування перевіряє ваш живий\nсайт ззовні й каже, які таблиці відповіли. Це триває близько 20 секунд і не\nпотребує облікового запису: ",[38,196,198],{"href":197},"\u002F#scan","сканувати застосунок",".",[27,201,203],{"id":202},"чому-це-трапляється-із-застосунками-які-ніхто-не-відкривав-навмисне","Чому це трапляється із застосунками, які ніхто не відкривав навмисне",[10,205,206],{},"Бо виправлення, яке повертає зламаний застосунок до життя, зазвичай і є тим,\nщо відкриває таблицю.",[10,208,209],{},"Послідовність така. Row Level Security вмикаєте ви або білдер. Ваш застосунок\nодразу перестає показувати дані, бо увімкнено без правил означає, що база\nвідмовляє всім, і вам також. Ви надсилаєте помилку своєму асистентові, він\nпише політику, яка дозволяє будь-який запит, і застосунок знову працює. Після\nцього ніщо не виглядає неправильним.",[10,211,212,213,217],{},"Саме цю політику ми й знаходимо. Панель звітує, що таблиця захищена, бо\nперемикач увімкнено й політика існує. Стаття про те,\n",[38,214,216],{"href":215},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","чому увімкнений Row Level Security не означає, що таблиця захищена",",\nпроходить чотири можливі стани таблиці й показує, як упізнати свій.",[27,219,221],{"id":220},"витік-яким-вас-лякали-виявився-рідкісним","Витік, яким вас лякали, виявився рідкісним",[10,223,224],{},"На всі 30 998 застосунків секретний ключ Supabase у браузері (той, що ігнорує\nкожне написане вами правило) трапився 3 рази.",[10,226,227,228,231],{},"Це витік, про який власники застосунків чують постійно, і водночас той, який ми\nзнаходили найрідше. Він серйозний, коли стається, і\n",[38,229,230],{"href":40},"варто вміти його впізнати",", але\nтривога, витрачена там, стереже двері, які майже завжди зачинені. Звичайним\nотвором у цих застосунках є проста таблиця без жодного правила.",[27,233,235],{"id":234},"як-перевірити-власний-застосунок","Як перевірити власний застосунок",[10,237,238],{},"Два місця, куди варто зазирнути у вашій базі даних Supabase, і один спосіб\nпобачити її звідти, де стоїть сторонній.",[10,240,241,244],{},[17,242,243],{},"Відкрийте Security Advisor у панелі Supabase."," Він перелічує кожну таблицю з\nвимкненим Row Level Security, і це найочевидніший різновид цієї проблеми.\nSupabase добре про це сигналізує, і якщо ваш проєкт є в тому переліку, ви маєте\nвідповідь, не читаючи жодного рядка SQL.",[10,246,247,250],{},[17,248,249],{},"Далі прочитайте політики кожної таблиці, де є люди."," Security Advisor не\nможе вирішити, чи дозвільна політика зроблена навмисно, бо для каталогу товарів\nвона була б правильною. Відкрийте таблицю, подивіться політику й перевірте, чи\nназиває вона умову, чи дозволяє всім.",[10,252,253,256,257,259],{},[17,254,255],{},"Або перевірте це ззовні, бо саме там живе ризик."," Сторонній не відкриває вашу\nпанель. Наше безкоштовне сканування робить той самий анонімний запит, що й\nлюдина ззовні, і повідомляє, які таблиці відповіли:\n",[38,258,198],{"href":197},", без облікового запису й без встановлення.",[27,261,263],{"id":262},"що-робити-з-таблицею-яку-не-мали-б-читати","Що робити з таблицею, яку не мали б читати",[265,266,267],"key-takeaways",{},[268,269,270,286,289,292,295],"ul",{},[271,272,273,274,171,276,171,278,171,280,282,283,285],"li",{},"Почніть із таблиць, де є люди. У ",[164,275,166],{},[164,277,170],{},[164,279,174],{},[164,281,177],{}," і ",[164,284,180],{}," лежать чужі дані, і саме вони варті вечора.",[271,287,288],{},"Напишіть правило, перш ніж розширювати щось інше. Політика, яка називає умову (цей рядок належить цьому авторизованому користувачеві), і є тим, що робить публічний ключ у вашому застосунку безпечним там, де він лежить.",[271,290,291],{},"Перевіряйте політику, а не перемикач. Увімкнено з правилом, яке дозволяє всім, ззовні виглядає так само, як вимкнено, а ваша панель показує перший випадок як захищений.",[271,293,294],{},"Справді публічні таблиці не чіпайте. Те, що перелік товарів або опублікована стаття читаються, є правильним, і вимкнути це означає зламати застосунок ні за що.",[271,296,297],{},"Після зміни перевірте так, як перевірив би сторонній. Те, що ваш застосунок показує правильне, доводить, що просить ваш застосунок, а не що віддала б ваша база.",[10,299,300],{},"Перевірити це один раз займає вечір. Утримати відповідь правдивою й наступного\nмісяця – це та частина, що у вечір не вміщається, і саме для неї ми зробили Reeve\nCare. Він повторює цю саму перевірку на вашому застосунку за розкладом і пише\nвам листа, коли відповідь погіршується, бо таблицю, яка в березні була\nзачинена, а в червні відкрита, зсередини власного застосунку не помічає ніхто.",[117,302],{"alt":303,"caption":304,"src":305},"Логотип Reeve Care поряд із двома рядами. У верхньому ряду смужку рядків таблиці читає лупа, а поряд стоїть стрілка повторення. У нижньому базу даних усередині пунктирної рамки копіюють у файл поза нею, а біля копії стоїть лупа.","Дві роботи: перевірка запускається знову за розкладом, а копія вашої бази виходить за межі вашого облікового запису Supabase і її перечитують, перш ніж зарахувати.","\u002Fblog\u002Fcan-anyone-read-your-supabase-database\u002Fcare-watch-and-backup-1600x520.png",[10,307,308,309,199],{},"Він також тримає власні резервні копії вашої бази даних Supabase, зроблені за\nрозкладом, збережені поза вашим обліковим записом Supabase і перечитані для\nперевірки, перш ніж їх зарахувати, з відновленням, яке спершу знімає копію\nпоточного стану, а вже потім щось відтворює. Ця друга половина важить тут тому,\nщо ми завжди перевіряємо лише читання. Та сама дозвільна політика може\nдозволяти й запис, а сторонній, який пише у вашу таблицю, і є тим варіантом, що\nїї спорожнює, і тоді копія «до» лишається єдиним, що поверне рядки. Care покриває вашу базу\nданих, а також файли, завантажені в Storage, щойно ви їх під’єднаєте, на\nSupabase, а не на кожному різновиді бази:\n",[38,310,312],{"href":311},"\u002F#pricing","за чим він стежить і скільки коштує",[10,314,315,316,320,321,199],{},"Якщо вам зручніше йти списком, то\n",[38,317,319],{"href":318},"\u002Fchecklist","10-хвилинний чекліст безпеки"," охоплює це разом з іншим, що варто\nпозакривати у щойно запущеному застосунку. А якщо таблиця постояла відкритою,\nто що ви зможете скасувати потім, повністю залежить від того,\n",[38,322,324],{"href":323},"\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database","що ви зберігали",{"title":326,"searchDepth":327,"depth":327,"links":328},"",3,[329,331,332,333,334,335,336],{"id":29,"depth":330,"text":30},2,{"id":51,"depth":330,"text":52},{"id":150,"depth":330,"text":151},{"id":202,"depth":330,"text":203},{"id":220,"depth":330,"text":221},{"id":234,"depth":330,"text":235},{"id":262,"depth":330,"text":263},"Основи безпеки",null,"Чи може будь-хто прочитати вашу базу даних Supabase без входу? Ми просканували 30 998 живих застосунків, зроблених ШІ-білдерами, і виміряли, як часто так.",false,"md",[343,346,349,352,355],{"q":344,"a":345},"Як дізнатися, чи може будь-хто прочитати мою базу даних Supabase?","Дві перевірки закривають більшу частину питання. У панелі Supabase відкрийте Security Advisor: він перелічує кожну таблицю з вимкненим Row Level Security, а такі читає будь-хто, у кого є ключ, що їде разом із вашим застосунком. Далі відкрийте політики кожної таблиці, де є люди, бо таблиця може пройти першу перевірку й лишатися відкритою: політика, яка дозволяє всім, увімкнена, чинна і в панелі виглядає як захищена. Якщо хочете побачити це ззовні, наше безкоштовне сканування читає ваш живий сайт так, як це зробив би сторонній.",{"q":347,"a":348},"Чи погано, якщо одну з моїх таблиць може прочитати будь-хто?","Залежить від таблиці, і вирішити це можете тільки ви. Перелік товарів, опублікованих статей або закладів на карті створений, щоб його читали всі, і політика, яка це дозволяє, тут доречна. Те саме налаштування на таблиці користувачів, замовлень чи повідомлень означає, що сторонні читають ваших клієнтів. Запитайте себе, чи виклали б ви вміст цієї таблиці на відкриту сторінку, і нехай відповідь вирішить.",{"q":350,"a":351},"У мене увімкнено Row Level Security. Отже, мої таблиці захищені?","Не самим лише вмикачем. Перемикач і правила працюють як дві різні речі: увімкнено без жодного правила блокує всіх, зокрема й ваш власний застосунок, а увімкнено з дозвільним правилом не блокує нікого. Правило, яке пишуть, коли застосунок ламається після ввімкнення Row Level Security, зазвичай дозволяє будь-який запит від будь-кого. Це повертає застосунок до життя і лишає таблицю відкритою. Читайте політику на таблиці, а не перемикач.",{"q":353,"a":354},"У моєму застосунку є екран входу. Хіба він не тримає людей подалі від бази?","Ні. Екран входу вирішує, що показує ваш застосунок. Він не вирішує, що віддає ваша база даних, бо запит зовсім не мусить приходити з вашого застосунку: ключ, який застосунок несе із собою, прочитає будь-який відвідувач і використає проти вашої бази напряму. Відповідь визначає Row Level Security на кожній таблиці.",{"q":356,"a":357},"Що зробити першим, якщо я знайшов таблицю, яку читають сторонні?","Спершу полагодьте політику на цій таблиці, а потім подивіться, що було досяжним, поки вона стояла відкритою. Почніть із таблиць, де є люди, бо саме там лежать чужі дані. Якщо таблиця була відкрита й містить персональні дані, перевірте, чи місцеві правила зобов'язують вас когось повідомити; це питання до юриста, а не до сканера.","\u002Fblog\u002Fcan-anyone-read-your-supabase-database\u002Fcard-800x500.png",[360,361,362,363,364],"чи може будь-хто прочитати мою базу supabase","база даних supabase публічна","таблиця supabase читається всіма","lovable supabase безпека","supabase rls відкрита таблиця",{},true,"Чи може будь-хто прочитати вашу базу Supabase?","\u002Fblog\u002Fcan-anyone-read-your-supabase-database","2026-08-18",{"title":5,"description":339},"blog\u002Fcan-anyone-read-your-supabase-database",[373,374,375],"Чи може будь-хто прочитати вашу базу даних Supabase без входу? У 2 096 із 3 680 застосунків, де перевірку вдалося завершити (57 %), принаймні одна таблиця відповіла: так.","Це не автоматично витік. Деякі таблиці й мають бути публічними. Але в 394 із цих застосунків відкритою була таблиця з назвою про людей: users, profiles, customers, orders.","Те, чим лякають найчастіше, а саме секретний ключ у самому застосунку, трапилося 3 рази на 30 998 застосунків. Звичайною є якраз відкрита таблиця.","5eq-g0jOW2ZGpvMP0bN0WCE4ewa1cAkxU6cPfAq4Otk",1787826051150]