[{"data":1,"prerenderedAt":730},["ShallowReactive",2],{"blog-uk-supabase-rls-disabled-in-public":3,"blog-index-uk":489},{"id":4,"title":5,"body":6,"category":445,"cover":446,"coverAlt":447,"description":448,"draft":449,"extension":450,"faq":451,"image":467,"keywords":468,"meta":477,"navigation":478,"ogTitle":479,"path":480,"published":481,"seo":482,"stem":483,"tldr":484,"updated":481,"__hash__":488},"blog_uk\u002Fblog\u002Fsupabase-rls-disabled-in-public.md","Supabase \"RLS disabled in public\": чого не бачить попередження",{"type":7,"value":8,"toc":433},"minimark",[9,18,29,36,41,44,55,58,61,65,68,71,77,80,83,87,98,101,107,110,117,211,214,220,234,238,241,248,251,254,260,270,274,277,280,285,298,305,309,312,315,328,334,347,351,354,361,364,369,372,384,388,420],[10,11,12,13,17],"p",{},"Ви відкрили Security Advisor у своєму дашборді Supabase, або хтось тицьнув вам\nйого вивід, і ось воно червоним: ",[14,15,16],"strong",{},"RLS disabled in public",". Нижче по рядку на\nтаблицю, словами самого Supabase:",[19,20,25],"pre",{"className":21,"code":23,"language":24},[22],"language-text","Table public.profiles is public, but RLS has not been enabled.\n","text",[26,27,23],"code",{"__ignoreMap":28},"",[10,30,31,32,35],{},"Ось те, що посібник за посібником переказує неправильно: ",[14,33,34],{},"розібрати цей список\nне означає, що ніхто не може прочитати ваші дані."," Для політики, яка впускає\nвсіх, в Advisor є окреме правило, і воно пропускає рівно ту форму, яку пише\nконструктор зі ШІ, коли розблоковує ваш застосунок. Тож список, який ви щойно\nрозібрали, і список таблиць, які може прочитати незнайомець, це два різні\nсписки, і одного з них ніде у вашому дашборді не надруковано.",[37,38,40],"h2",{"id":39},"що-означає-rls-disabled-in-public","Що означає \"RLS disabled in public\"?",[10,42,43],{},"У таблиці з вашої схеми public вимкнено Row Level Security, і наслідок цього\nтакий: будь-хто з адресою вашого проєкту може прочитати кожен її рядок.",[10,45,46,47,50,51,54],{},"Обидві половини варто розгорнути. ",[14,48,49],{},"Схема public"," це місце, куди таблиця\nпотрапляє, коли ніхто не сказав інакше, і саме цю частину вашої бази Supabase\nпублікує в інтернеті: кожен проєкт відповідає на запити за власною адресою, а\nключ, потрібний, щоб з ним говорити, лежить у коді, який ваш сайт віддає\nкожному відвідувачу. ",[14,52,53],{},"Row Level Security"," це перемикач, який вирішує, чи\nзвірятимуть ваші правила перед тим, як віддати рядки. Коли він вимкнений,\nзвіряти нема з чим, тому відповідь завжди ствердна.",[10,56,57],{},"Саме через це поєднання воно повідомляється як помилка, а не як попередження.\nAdvisor розкладає свої знахідки по рівнях, і це найвищий з них.",[10,59,60],{},"Уявіть Advisor як інспектора з планшетом. Він уважно читає ваші папери і робить\nце добре. Він ніколи не смикає ручку дверей. Ніщо на тій панелі не є\nрезультатом запиту, який хтось надіслав до вашої бази.",[37,62,64],{"id":63},"чи-зламає-застосунок-увімкнення-rls","Чи зламає застосунок увімкнення RLS?",[10,66,67],{},"Так, одразу, і саме в цьому робота налаштування.",[10,69,70],{},"Виправлення, яке дає вам Supabase, це один рядок, і ви виконуєте його в SQL\nEditor:",[19,72,75],{"className":73,"code":74,"language":24},[22],"alter table public.profiles enable row level security;\n",[26,76,74],{"__ignoreMap":28},[10,78,79],{},"Власна документація Supabase прямо каже, що буде далі: з публічним ключем дані\nстають недоступними через API, доки не визначено політик. Тож ваші списки\nповертаються порожніми, екрани лишаються білими, а помилку в Advisor заміняє\nтихіший запис про те, що в таблиці RLS увімкнено, але політик немає.",[10,81,82],{},"Це зачинені двері, у списку біля яких поки нікого немає. Далі більшість людей\nдодає політику, яка дозволяє читати всім, бо саме після неї екрани знову щось\nпоказують.",[37,84,86],{"id":85},"збій-якого-попередження-не-шукає","Збій, якого попередження не шукає",[10,88,89,90,93,94,97],{},"Таблиця з ",[14,91,92],{},"увімкненим"," Row Level Security і політикою читання, умова якої\n",[26,95,96],{},"USING (true)",", віддає рівно ті самі рядки рівно тому самому незнайомцю.\nAdvisor її не позначає.",[10,99,100],{},"Це не недогляд. Правило для завжди істинних політик у Supabase таки є, і\nполітики читання воно лишає осторонь свідомо. Власний опис правила каже про це\nтак:",[19,102,105],{"className":103,"code":104,"language":24},[22],"SELECT policies with `USING (true)` are intentionally excluded as this\npattern is often used deliberately for public read access.\n",[26,106,104],{"__ignoreMap":28},[10,108,109],{},"У загальному випадку правило має рацію. Каталог товарів, список опублікованих\nстатей, карта закладів: усе це створено, щоб його читав будь-хто, і позначати\nтаке означало б привчити кожного розробника на платформі ігнорувати панель.\nЧого жоден лінтер знати не може, так це чи містить таблиця перед ним заклади,\nчи клієнтів.",[10,111,112,113,116],{},"А політика, яка дозволяє читати всім, це найшвидший спосіб знову підняти\nзламаний застосунок, і тому конструктор зі ШІ хапається саме за неї. Попросіть\nCursor чи Lovable полагодити порожні екрани, і ",[26,114,115],{},"FOR SELECT USING (true)"," буде\nчастою відповіддю. Ваш застосунок завантажується, помилка зникає, панель\nзамовкає, а таблиця читається так само, як і до початку.",[118,119,120,136],"table",{},[121,122,123],"thead",{},[124,125,126,130,133],"tr",{},[127,128,129],"th",{},"Що Advisor може побачити",[127,131,132],{},"Як він це повідомляє",[127,134,135],{},"Що отримає незнайомець з вашим публічним ключем",[137,138,139,155,169,182,197],"tbody",{},[124,140,141,145,148],{},[142,143,144],"td",{},"RLS вимкнено",[142,146,147],{},"Помилка",[142,149,150],{},[151,152,154],"key-verdict",{"type":153},"danger","Кожен рядок",[124,156,157,160,163],{},[142,158,159],{},"RLS увімкнено, жодної політики",[142,161,162],{},"Інфо",[142,164,165],{},[151,166,168],{"type":167},"safe","Нічого",[124,170,171,176,178],{},[142,172,173,174],{},"RLS увімкнено, ",[26,175,115],{},[142,177,168],{},[142,179,180],{},[151,181,154],{"type":153},[124,183,184,189,192],{},[142,185,173,186],{},[26,187,188],{},"FOR ALL USING (true)",[142,190,191],{},"Попередження",[142,193,194],{},[151,195,196],{"type":153},"Кожен рядок, і може їх змінити",[124,198,199,204,206],{},[142,200,173,201],{},[26,202,203],{},"USING (auth.uid() = user_id)",[142,205,168],{},[142,207,208],{},[151,209,210],{"type":167},"Лише свої",[10,212,213],{},"Два рядки, де не повідомляється нічого, це пара, біля якої варто затриматися.\nОдин з них це таблиця, до якої поза вашим застосунком ніхто не дотягнеться.\nДругий це таблиця, яку може прочитати будь-хто. Ваш дашборд однаково мовчить\nпро обидві.",[215,216],"diagram",{"alt":217,"caption":218,"src":219},"Дві смуги, що закінчуються тими самими чотирма рядками, усі підсвічені. У верхній смузі перемикач Row Level Security вимкнено, і поруч стоїть знак попередження. У нижній він увімкнений, політика показує USING (true), а там, де мав би бути знак, порожнє пунктирне коло.","Ті самі чотири рядки, віддані тому самому незнайомцю. Різниця між смугами лише в тому, про яку з них ваш дашборд взагалі щось каже.","\u002Fblog\u002Fsupabase-rls-disabled-in-public\u002Ftwo-tables-one-outcome-1600x640.png",[10,221,222,223,228,229,233],{},"Як ця політика там опинилася і чим замінити її по таблиці за раз, розібрано в\n",[224,225,227],"a",{"href":226},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","Row Level Security увімкнено, а таблиця досі публічна",".\nЯкщо та сама політика має ще й дозволяти вашому застосунку записувати, наступна\nпомилка, яку ви зустрінете, це\n",[224,230,232],{"href":231},"\u002Fblog\u002Fnew-row-violates-row-level-security-policy","new row violates row-level security policy",".",[37,235,237],{"id":236},"чому-таблиця-зроблена-міграцією-вас-ніколи-не-попередила","Чому таблиця, зроблена міграцією, вас ніколи не попередила",[10,239,240],{},"Бо Table Editor вмикає Row Level Security за вас, а SQL цього не робить.",[10,242,243,244,247],{},"Supabase документує цей поділ без натяків: таблиці, створені через Table Editor\nу дашборді, типово мають RLS увімкненим, а таблицям, створеним чистим SQL,\nйого треба вмикати явно. Таблиця, яку ви наклацали, стартує захищеною. Таблиця,\nщо приїхала файлом міграції, командою ",[26,245,246],{},"supabase db push",", фрагментом у SQL\nEditor чи інструкцією, яку виконав за вас конструктор зі ШІ, стартує відкритою.",[10,249,250],{},"Саме другим шляхом конструктор зі ШІ й створює таблиці. Він пише SQL і виконує\nйого за вас, тож галочки ви ніколи не бачили і ніколи не бачили, що її не\nпоставлено.",[10,252,253],{},"Звичка, яка це закриває, полягає в тому, щоб класти рядок у міграцію поруч із\nтим, що він захищає:",[19,255,258],{"className":256,"code":257,"language":24},[22],"create table public.profiles (\n  id uuid primary key references auth.users,\n  full_name text\n);\n\nalter table public.profiles enable row level security;\n",[26,259,257],{"__ignoreMap":28},[261,262,264],"callout",{"type":263},"warn",[10,265,266,269],{},[14,267,268],{},"Advisor це знімок, а не спостереження."," Він повідомляє, якою ваша база була\nпід час останнього запуску, і спокійно показуватиме вам чисту панель, зняту ще\nдо сьогоднішньої ранкової міграції. Запускайте його наново після будь-якої\nзміни, що створює таблицю чи торкається політики, а в проєкті, зробленому зі\nШІ, це майже кожна зміна.",[37,271,273],{"id":272},"як-перевірити-таблиці-які-advisor-пропустив","Як перевірити таблиці, які Advisor пропустив",[10,275,276],{},"Поставте своїй базі те саме запитання, що й незнайомець: надішліть запит\nззовні, з публічним ключем, який їде всередині вашого застосунку, і подивіться,\nщо повернеться.",[10,278,279],{},"Саме навколо цієї різниці крутиться вся стаття. Advisor читає вашу\nконфігурацію. Запит читає ваші рядки. Це два різні запитання, і таблиця може\nпройти перше й не пройти друге, що дозвільна політика читання й робить.",[215,281],{"alt":282,"caption":283,"src":284},"Двоє читачів поза пунктирною межею проєкту. Лупа дотягується лише до панелі налаштувань усередині й повертається з порожнім пунктирним колом. Запит людини проходить повз неї до рядків таблиці й повертається разом з ними.","Advisor зупиняється на ваших налаштуваннях. Запит ззовні йде далі до рядків, і саме тому ці двоє можуть казати про ту саму таблицю різне.","\u002Fblog\u002Fsupabase-rls-disabled-in-public\u002Fsettings-versus-answer-1600x600.png",[10,286,287,288,292,293,297],{},"Ми зробили цей запит у великому масштабі. Між 12 і 14 серпня 2026 року ми\nпрогнали дев'ять зовнішніх перевірок по 30 998 живих застосунках, опублікованих\nз Lovable, Base44, Replit, v0 і Bolt. З 3 680 застосунків на Supabase, де\nперевірку вдалося довести до кінця, 2 096 мали щонайменше одну таблицю, яка\nвідповіла на анонімний запит рядками. Це 57 %, і це частка від застосунків, від\nяких ми отримали чітку відповідь, а не від усього, що ми просканували. Серед\nзастосунків, зроблених у Bolt, вийшло 27 з 35, і ця вибірка достатньо мала, щоб\nчитати її як напрямок, а не як показник.\n",[224,289,291],{"href":290},"\u002Fresearch\u002Fvibe-coded-app-security-2026","Повний набір даних опубліковано",", а\n",[224,294,296],{"href":295},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","від чого ці 57 % є часткою","\nпроходить весь підрахунок.",[10,299,300,301,233],{},"Той самий запит до однієї таблиці ви можете зробити самі, браузером і власним\nпублічним ключем. Якщо не хочете йти таблиця за таблицею, наше безкоштовне\nсканування питає ваш живий застосунок ззовні й каже, які таблиці відповіли.\nВоно триває близько 20 секунд і не потребує акаунта:\n",[224,302,304],{"href":303},"\u002F#scan","сканувати застосунок",[37,306,308],{"id":307},"чи-потрібна-резервна-копія-перед-зміною-політик-rls","Чи потрібна резервна копія перед зміною політик RLS?",[10,310,311],{},"Для будь-якої таблиці, у яку ваш застосунок пише, так. Для таблиці лише на\nчитання, яку ви просто звужуєте, ризик у тому, що застосунок побіліє, а не в\nтому, що зникнуть дані.",[10,313,314],{},"Тут варто розділити дві різні речі, бо лише одна з них стосується ремонту.",[10,316,317,320,321,323,324,327],{},[14,318,319],{},"Що дозвільна політика вже дозволила."," Якщо правилом на таблиці було\n",[26,322,188],{},", а не ",[26,325,326],{},"FOR SELECT",", то кожен, хто її знайшов, міг рядки\nне лише читати, а й змінювати та видаляти, і звузити її сьогодні нічого не\nзмінює щодо вчора. Цей варіант зазвичай виринає як звернення в підтримку про\nдані, які змінилися самі, або як таблиця, що раптом порожня.",[10,329,330,333],{},[14,331,332],{},"Сам ремонт."," Переписати політики на десятку таблиць означає змінити живу\nбазу, і пишуть цю зміну ті самі інструменти, що створили проблему. Міграція,\nяка видаляє політику й перестворює її криво, це звичайнісінький вівторок, а\nшлях назад це копія того, як усе було годину тому.",[10,335,336,337,341,342,346],{},"На платному плані Supabase учорашня копія лежить у консолі. На безкоштовному\nплані відступати нема куди, бо\n",[224,338,340],{"href":339},"\u002Fblog\u002Fdoes-supabase-back-up-my-database","безкоштовний план не робить жодних автоматичних резервних копій",".\nЯкщо це про вас, зробіть копію, перш ніж чіпати політику:\n",[224,343,345],{"href":344},"\u002Fblog\u002Fback-up-supabase-free-tier","як зробити резервну копію бази Supabase на безкоштовному плані","\nце десятихвилинна версія.",[37,348,350],{"id":349},"копію-чого-зберігає-reeve-care","Копію чого зберігає Reeve Care",[10,352,353],{},"Вашої бази Supabase, скопійованої за розкладом, збереженої поза вашим акаунтом\nSupabase, зашифрованої й перечитаної до того, як дата у вашому дашборді\nзрушить. Файли, які завантажили ваші користувачі, їдуть разом з нею, щойно ви\nпід'єднаєте ключ Storage.",[10,355,356,357,360],{},"Дві межі, названі наперед. Резервні копії працюють ",[14,358,359],{},"лише для Supabase",": якщо\nваші дані живуть деінде, ми так і кажемо, замість продавати вам підписку, яка\nстереже порожню коробку. А ключ Storage запитується окремо, бо Supabase не\nвидає для файлів ключа лише на читання, тож той, що копіює ваші завантаження,\nуміє й записувати. Той, що копіює вашу базу, не вміє. Під'єднувати його\nнеобов'язково, і база резервується в будь-якому разі.",[10,362,363],{},"Відновлення це та частина, яка важлива для цієї статті. Покласти стару копію\nповерх живої бази означає натиснути найстрашнішу кнопку в продукті, тож Care\nспершу знімає копію поточного стану й лише потім відтворює ту, яку ви обрали. У\nсамого відновлення теж є скасування.",[215,365],{"alt":366,"caption":367,"src":368},"Пунктирна межа навколо бази даних, поруч знак Reeve Care. Крок один це стрілка, що виходить за межу до свіжої копії. Крок два це стрілка, що заносить збережену копію назад усередину.","Що відбувається, коли ви натискаєте відновлення. Поточний стан копіюється назовні до того, як щось буде відтворено, тож натискання кнопки теж можна скасувати.","\u002Fblog\u002Fsupabase-rls-disabled-in-public\u002Frestore-takes-a-copy-first-1600x520.png",[10,370,371],{},"Друга половина Care це саме те, на що стаття весь час показує. Політику, яка\nпослабилася під час міграції, поглядом не знайти, тож та сама зовнішня\nперевірка запускається знову за розкладом і повідомляє вас, коли відповідь\nзмінюється. Аптайм, місячний звіт і сканування входять у ту саму підписку.",[10,373,374,375,379,380,233],{},"Чого копія не робить, так це не пише за вас політики, і жодна резервна копія не\nробить відкриту таблицю закритою. Ці таблиці лишаються вашою роботою. Копія\nміняє те, що станеться, коли ремонт піде не туди.\n",[224,376,378],{"href":377},"\u002Fsupabase-backups","Що Reeve резервує в Supabase, як часто і що робить відновлення","\nмалює весь цикл, а плани та їхні ціни є на\n",[224,381,383],{"href":382},"\u002Fpricing","сторінці цін",[37,385,387],{"id":386},"що-зробити-цього-тижня","Що зробити цього тижня",[389,390,391],"key-takeaways",{},[392,393,394,401,407,410,417],"ul",{},[395,396,397,398,233],"li",{},"Спершу розберіть записи \"RLS disabled in public\". Це таблиці, де взагалі нічого не звіряють, і виправлення для кожної це один рядок ",[26,399,400],{},"alter table",[395,402,403,404,406],{},"Потім відкрийте Authentication → Policies і прочитайте умову кожної політики, що лишилася. ",[26,405,96],{}," на політиці читання для Advisor невидимий, а для незнайомця відчинений навстіж.",[395,408,409],{},"Вирішіть по таблиці за раз, чи спокійно вам було б опублікувати її вміст на сторінці. Це запитання, на яке лінтер за вас не відповість, і для дозвільної політики читання воно єдине, що має значення.",[395,411,412,413,416],{},"Кладіть ",[26,414,415],{},"alter table ... enable row level security;"," у кожну міграцію, що створює таблицю, і після кожної запускайте Advisor наново. Типове значення в дашборді стосується лише тих таблиць, які ви наклацали.",[395,418,419],{},"Зробіть копію бази, перш ніж переписувати політики на живій таблиці, і подивіться, на якому ви плані Supabase, щоб знати, чи копія у вас уже є.",[10,421,422,423,427,428,432],{},"Почніть з таблиці, за яку вам було б найніяковіше як за публічну сторінку.\n",[224,424,426],{"href":425},"\u002Fchecklist","Десятихвилинний чекліст безпеки"," охоплює це разом з рештою того,\nщо варто перевірити у щойно запущеному застосунку, а\n",[224,429,431],{"href":430},"\u002Fis-your-supabase-app-safe","посібник з безпеки Supabase"," проходить те, що ще\nзазвичай лишається відкритим.",{"title":28,"searchDepth":434,"depth":434,"links":435},3,[436,438,439,440,441,442,443,444],{"id":39,"depth":437,"text":40},2,{"id":63,"depth":437,"text":64},{"id":85,"depth":437,"text":86},{"id":236,"depth":437,"text":237},{"id":272,"depth":437,"text":273},{"id":307,"depth":437,"text":308},{"id":349,"depth":437,"text":350},{"id":386,"depth":437,"text":387},"Основи безпеки","\u002Fblog\u002Fsupabase-rls-disabled-in-public\u002Fcover-1200x630.png","Панель дашборду зі списком кількох таблиць, зі знаком попередження біля однієї з них і нічим біля решти.","Supabase позначає \"RLS disabled in public\" як помилку. Про політику читання, яка лишає вашу таблицю так само відкритою, він не каже нічого.",false,"md",[452,455,458,461,464],{"q":453,"a":454},"\"RLS disabled in public\" це помилка чи попередження?","Помилка, і це найвищий рівень, яким користується Advisor. Запис звучить так: \"Table public.\u003Cname> is public, but RLS has not been enabled.\" Два сусідні записи тихіші: таблиця з увімкненим перемикачем і без жодної політики позначається як INFO, а політика з завжди істинною умовою як WARN. Ці рівні кажуть, наскільки лінтер упевнений у тому, що бачить у вашій конфігурації, а не наскільки великі у вас неприємності.",{"q":456,"a":457},"Чи зламає застосунок увімкнення Row Level Security?","Одразу, так, і саме в цьому робота цього налаштування. Supabase документує, що з публічним ключем дані стають недоступними через API, доки не визначено політик, тож щойно ви виконаєте рядок, ваші списки повернуться порожніми, а екрани лишаться білими. Застосунок повернеться, коли ви додасте політику, яка каже, хто які рядки може бачити. Помилка, якої варто уникнути, це додати таку, що дозволяє всім, бо цей варіант теж змушує застосунок працювати.",{"q":459,"a":460},"Я увімкнув RLS, і тепер нічого не завантажується. Що сталося?","Нічого не зламалося. З увімкненим Row Level Security і без написаних політик Postgres (рушій бази даних під Supabase) відмовляє кожному запиту, зокрема й тим, що йдуть з вашого власного застосунку, а Advisor міняє свою помилку на запис INFO про те, що в таблиці RLS увімкнено, але політик немає. Напишіть політику для рядків, які має показувати ваш застосунок, почавши з тієї, що порівнює авторизованого відвідувача зі стовпцем власника на рядку.",{"q":462,"a":463},"Мою таблицю не позначено, але прочитати її може будь-хто. Чому?","Найімовірніше тому, що Row Level Security увімкнено, а політика читання має умову USING (true). Правило для завжди істинних політик в Advisor таки є, і політики читання воно свідомо пропускає, бо публічний доступ на читання це розумна річ для каталогу товарів чи списку опублікованих статей. Ніщо у вашому дашборді не знає, чи ваша таблиця містить заклади, чи клієнтів, тож ця перевірка лишається вашою.",{"q":465,"a":466},"Чи потрібен Row Level Security, якщо застосунок спілкується лише з моїм сервером?","Якщо браузер справді ніколи не звертається до Supabase і в коді, який ваш сайт віддає відвідувачам, немає публічного ключа, тоді Data API не є входом, і не політики захищають ці таблиці. У застосунку, зробленому в Lovable, Bolt чи v0, таке трапляється рідко, бо ці конструктори типово підключають браузер напряму до Supabase. Відкрийте власний сайт, погляньте, чи є на сторінці URL проєкту та публічний ключ, і хай ця відповідь усе вирішить.","\u002Fblog\u002Fsupabase-rls-disabled-in-public\u002Fcard-800x500.png",[469,470,471,472,473,474,475,476],"rls disabled in public","попередження supabase rls вимкнено","supabase security advisor","supabase database linter","supabase lint 0013","table is public but rls has not been enabled","увімкнути rls supabase","rls policy always true",{},true,"Supabase: чого не бачить \"RLS disabled in public\"","\u002Fblog\u002Fsupabase-rls-disabled-in-public","2026-09-09",{"title":5,"description":448},"blog\u002Fsupabase-rls-disabled-in-public",[485,486,487],"\"RLS disabled in public\" означає рівно одне: у таблиці з вашої схеми public вимкнено Row Level Security, тож прочитати її може будь-хто, хто має адресу вашого проєкту та публічний ключ.","Про таблицю, де ви увімкнули перемикач, а потім написали політику, яка дозволяє читати всім, це повідомлення мовчить. Правило для завжди істинних політик існує, і воно свідомо пропускає політики читання.","Полагодьте позначені таблиці, а решту перевірте ззовні, бо Advisor читає ваші налаштування й ніколи не питає у вашої бази, що насправді отримує незнайомець.","Ik2dg8-fctIejxObt-vp5v5NJ71MgfnJH3gKde6_RAk",[490,497,503,509,515,521,527,533,539,545,551,557,563,569,575,576,582,588,594,600,606,612,618,624,630,635,641,647,652,658,664,670,676,682,688,693,698,704,709,714,719,725],{"path":491,"title":492,"description":493,"published":494,"category":495,"image":496,"draft":449},"\u002Fblog\u002Fsupabase-backup-auth-users","Чому у вашому дампі Supabase немає користувачів","Запустіть supabase db dump окремо і отримаєте форму вашої бази та жодного її рядка, без схеми auth, у якій живуть ваші користувачі.","2026-09-23","Backups","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":498,"title":499,"description":500,"published":501,"category":445,"image":502,"draft":449},"\u002Fblog\u002Fdomain-and-certificate-expiry","Домен закінчився, сайт лежить: що буде далі","Ваш домен закінчився і сайт лежить. Ось який годинник уже пішов, чому прострочений сертифікат це менша з двох бід, і як перевірити обидва.","2026-09-22","\u002Fblog\u002Fdomain-and-certificate-expiry\u002Fcard-800x500.png",{"path":504,"title":505,"description":506,"published":507,"category":445,"image":508,"draft":449},"\u002Fblog\u002Fis-lovable-safe","Чи безпечний Lovable? Що показали 18 554 застосунки Lovable","Чи безпечний Lovable? Ми прогнали 18 554 живі застосунки Lovable через дев’ять перевірок. Платформа виявилася найчистішою з п’яти. Знахідки були в застосунках.","2026-09-21","\u002Fblog\u002Fis-lovable-safe\u002Fcard-800x500.png",{"path":510,"title":511,"description":512,"published":513,"category":445,"image":514,"draft":449},"\u002Fblog\u002Fvibe-coded-app-security-checklist","Чек-лист безпеки для vibe coding, у девʼяти перевірках","Чек-лист безпеки для vibe coding із девʼяти пунктів, кожен з яких будь-хто може перевірити у вашому живому застосунку ззовні, і кожен має тест на один рядок.","2026-09-20","\u002Fblog\u002Fvibe-coded-app-security-checklist\u002Fcard-800x500.png",{"path":516,"title":517,"description":518,"published":519,"category":445,"image":520,"draft":449},"\u002Fblog\u002Fstripe-secret-key-in-frontend","Секретний ключ Stripe у фронтенді може рухати гроші","Секретний ключ Stripe, відкритий у вашому фронтенді, може повертати кошти, списувати й читати кожну картку клієнта. А ключ pk_live_ там і має бути.","2026-09-19","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Fcard-800x500.png",{"path":522,"title":523,"description":524,"published":525,"category":445,"image":526,"draft":449},"\u002Fblog\u002Fvite-and-next-public-env-vars","Змінні оточення Vite відкриті: префікс означає опублікувати це","Змінні оточення Vite відкриті у вашому застосунку, бо так просив префікс. VITE_ і NEXT_PUBLIC_ означають опублікувати це, а ШІ, який їх додав, не знав ціни.","2026-09-18","\u002Fblog\u002Fvite-and-next-public-env-vars\u002Fcard-800x500.png",{"path":528,"title":529,"description":530,"published":531,"category":445,"image":532,"draft":449},"\u002Fblog\u002Fbase44-source-maps","Безпека Base44: що позначає скан і що з цього виправляти вам","Безпека Base44 на 5 438 просканованих застосунках: три знахідки майже на кожному належать платформі, source map є бейджем Base44, а ваша частина коротка.","2026-09-17","\u002Fblog\u002Fbase44-source-maps\u002Fcard-800x500.png",{"path":534,"title":535,"description":536,"published":537,"category":445,"image":538,"draft":449},"\u002Fblog\u002Fis-cursor-ai-safe","Чи безпечний Cursor AI? Редактор, код і опублікований застосунок","Чи безпечний Cursor AI? Три запитання в одному пошуку: що Cursor зберігає, у чому помиляється його код і чи відкритий застосунок, який ви опублікували.","2026-09-16","\u002Fblog\u002Fis-cursor-ai-safe\u002Fcard-800x500.png",{"path":540,"title":541,"description":542,"published":543,"category":445,"image":544,"draft":449},"\u002Fblog\u002Fis-replit-safe","Чи безпечний Replit? Що ми знайшли в 3 042 живих застосунках Replit","Чи безпечний Replit? Ми прогнали 3 042 живі застосунки Replit через дев’ять зовнішніх перевірок. Знахідки були в опублікованому застосунку, а не в хостингу.","2026-09-15","\u002Fblog\u002Fis-replit-safe\u002Fcard-800x500.png",{"path":546,"title":547,"description":548,"published":549,"category":495,"image":550,"draft":449},"\u002Fblog\u002Fsupabase-storage-backup","Supabase storage backup: у копії бази даних немає жодного файлу","Supabase storage backup це окрема робота. Копії бази даних зберігають список ваших файлів і жодного з них, тож після відновлення кожне завантаження зламане.","2026-09-14","\u002Fblog\u002Fsupabase-storage-backup\u002Fcard-800x500.png",{"path":552,"title":553,"description":554,"published":555,"category":495,"image":556,"draft":449},"\u002Fblog\u002Fsupabase-point-in-time-recovery","Point-in-time recovery у Supabase: ціна та межі","Point-in-time recovery у Supabase відмотує базу на будь-яку секунду за останній тиждень. Коштує $100 на місяць понад Pro і покриває лише базу даних.","2026-09-13","\u002Fblog\u002Fsupabase-point-in-time-recovery\u002Fcard-800x500.png",{"path":558,"title":559,"description":560,"published":561,"category":495,"image":562,"draft":449},"\u002Fblog\u002Fsupabase-project-paused-recover","Проєкт Supabase на паузі? Ваші дані нікуди не зникли","Supabase поставив ваш проєкт на паузу після тижня без активності. Нічого не видалено, кнопка Restore стоїть поруч із назвою, і у вас є рік, щоб натиснути.","2026-09-12","\u002Fblog\u002Fsupabase-project-paused-recover\u002Fcard-800x500.png",{"path":564,"title":565,"description":566,"published":567,"category":445,"image":568,"draft":449},"\u002Fblog\u002Fsafest-ai-app-builder","Який білдер застосунків з ШІ найбезпечніший? 30 998 тестів","Який білдер застосунків з ШІ найбезпечніший? Ми просканували 30 998 живих застосунків з Lovable, Base44, Replit, v0 і Bolt. Оцінку вирішує не білдер.","2026-09-11","\u002Fblog\u002Fsafest-ai-app-builder\u002Fcard-800x500.png",{"path":570,"title":571,"description":572,"published":573,"category":445,"image":574,"draft":449},"\u002Fblog\u002Fenable-rls-on-every-supabase-table","Увімкніть Row Level Security на кожній таблиці Supabase і перевірте","Row Level Security у Supabase без політики закриває таблицю повністю. Політика без увімкненого перемикача не робить нічого. Ось SQL, і ось перевірка.","2026-09-10","\u002Fblog\u002Fenable-rls-on-every-supabase-table\u002Fcard-800x500.png",{"path":480,"title":5,"description":448,"published":481,"category":445,"image":467,"draft":449},{"path":577,"title":578,"description":579,"published":580,"category":445,"image":581,"draft":449},"\u002Fblog\u002Frotate-supabase-service-role-key","Як замінити злитий ключ service_role у Supabase","Supabase каже спершу закрити витік. Інші посібники кажуть міняти негайно. Що правильно, залежить від того, куди саме потрапив ваш ключ service_role.","2026-09-08","\u002Fblog\u002Frotate-supabase-service-role-key\u002Fcard-800x500.png",{"path":583,"title":584,"description":585,"published":586,"category":445,"image":587,"draft":449},"\u002Fblog\u002Fvibe-coding-security-scanners-compared","Сканери безпеки для vibe coding у порівнянні, наш теж","Найкращий сканер безпеки для vibe coding залежить від трьох питань, на які не відповідає жоден перелік функцій. Десять інструментів і ціни.","2026-09-07","\u002Fblog\u002Fvibe-coding-security-scanners-compared\u002Fcard-800x500.png",{"path":589,"title":590,"description":591,"published":592,"category":445,"image":593,"draft":449},"\u002Fblog\u002Fsupabase-security-checker","Supabase security checker: п’ять перевірок, які зробите самі","Supabase security checker читає ваш опублікований застосунок, а не налаштування проєкту. Ось п’ять перевірок і як виконати кожну самостійно.","2026-09-06","\u002Fblog\u002Fsupabase-security-checker\u002Fcard-800x500.png",{"path":595,"title":596,"description":597,"published":598,"category":445,"image":599,"draft":449},"\u002Fblog\u002Fvibe-coding-security-scanner","Сканер безпеки для vibe coding: чого не бачить скан URL","Сканер безпеки для vibe coding читає ваш робочий застосунок ззовні. Що це охоплює, чотири речі, яких він не бачить, і як читати результат.","2026-09-05","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fcard-800x500.png",{"path":601,"title":602,"description":603,"published":604,"category":445,"image":605,"draft":449},"\u002Fblog\u002Fmissing-security-headers","Відсутні заголовки безпеки: коли це справді важливо","Відсутні заголовки безпеки трапляються в наших звітах найчастіше. Від чого вони захищають і коли це найменш терміновий рядок вашого звіту.","2026-09-04","\u002Fblog\u002Fmissing-security-headers\u002Fcard-800x500.png",{"path":607,"title":608,"description":609,"published":610,"category":445,"image":611,"draft":449},"\u002Fblog\u002Fopenai-api-key-exposed-in-frontend","Ваш ключ API OpenAI відкритий у фронтенді. Замініть його.","Ключ API OpenAI, відкритий у фронтенді, не можна прив'язати до домену. Замініть його сьогодні, перенесіть виклик на свій сервер і обмежте витрати.","2026-09-03","\u002Fblog\u002Fopenai-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":613,"title":614,"description":615,"published":616,"category":445,"image":617,"draft":449},"\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps","Ключ API у фронтенді: що насправді віддають 30 998 застосунків","Ключ API, відкритий у вашому фронтенді, зазвичай є ключем Google Maps. Ми просканували 30 998 vibe-coded застосунків і порахували, що витікає насправді.","2026-09-02","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fcard-800x500.png",{"path":619,"title":620,"description":621,"published":622,"category":495,"image":623,"draft":449},"\u002Fblog\u002Fsupabase-backup-tools-compared","Інструменти резервного копіювання Supabase, і наш серед них","Чотири види інструментів резервного копіювання Supabase, що копіює кожен і коли безкоштовна GitHub Action виграє в будь-якої оплати, нашої теж.","2026-09-01","\u002Fblog\u002Fsupabase-backup-tools-compared\u002Fcard-800x500.png",{"path":625,"title":626,"description":627,"published":628,"category":445,"image":629,"draft":449},"\u002Fblog\u002Freplit-secrets-explained","Як користуватися секретами в Replit і що все одно публікується","Як користуватися секретами в Replit: додати, прочитати і усунути дві причини undefined. А ще ключі, які цей інструмент не здатен зберегти в таємниці.","2026-08-31","\u002Fblog\u002Freplit-secrets-explained\u002Fcard-800x500.png",{"path":344,"title":631,"description":632,"published":633,"category":495,"image":634,"draft":449},"Резервні копії на безкоштовному тарифі Supabase без терміналу","На безкоштовному тарифі Supabase резервних копій немає: копію робите ви. Як зробити її з панелі та що втрачає шлях через CSV.","2026-08-30","\u002Fblog\u002Fback-up-supabase-free-tier\u002Fcard-800x500.png",{"path":636,"title":637,"description":638,"published":639,"category":445,"image":640,"draft":449},"\u002Fblog\u002Fis-supabase-secure","Чи безпечний Supabase? Так. Ваш проєкт це інше питання","Чи безпечний Supabase? Платформа проходить аудити, шифрує дані й тримає пентести. Їхня документація каже, де це закінчується і починаються ваші налаштування.","2026-08-29","\u002Fblog\u002Fis-supabase-secure\u002Fcard-800x500.png",{"path":642,"title":643,"description":644,"published":645,"category":445,"image":646,"draft":449},"\u002Fblog\u002Fwhere-to-find-supabase-api-keys","Де знайти API-ключі Supabase: anon, service_role і URL","URL проєкту, ключ anon і ключ service_role лежать на одній сторінці панелі. Ось де вона, і яке з чотирьох значень має бути у вашому застосунку.","2026-08-28","\u002Fblog\u002Fwhere-to-find-supabase-api-keys\u002Fcard-800x500.png",{"path":231,"title":648,"description":649,"published":650,"category":445,"image":651,"draft":449},"New row violates row-level security policy в Supabase. Що далі?","\"New row violates row-level security policy\" означає, що Supabase відмовив у записі. Швидке виправлення знову відкриває таблицю для всіх.","2026-08-27","\u002Fblog\u002Fnew-row-violates-row-level-security-policy\u002Fcard-800x500.png",{"path":653,"title":654,"description":655,"published":656,"category":445,"image":657,"draft":449},"\u002Fblog\u002Fcors-wildcard-security-risk","Чи є вайлдкард CORS ризиком для безпеки? Майже ніколи.","Чи є вайлдкард CORS ризиком для безпеки? Зазвичай це типове налаштування вашого білдера, і воно не видає нічого, що ваш сервер і так віддавав кожному.","2026-08-26","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fcard-800x500.png",{"path":659,"title":660,"description":661,"published":662,"category":495,"image":663,"draft":449},"\u002Fblog\u002Fsupabase-branching-is-not-a-backup","Branching у Supabase це не бекап. Він іде тільки вперед.","Чому branching у Supabase це не бекап: гілка стартує без ваших даних, а мердж переносить саму лише схему. Для чого він потрібен і що брати замість нього.","2026-08-25","\u002Fblog\u002Fsupabase-branching-is-not-a-backup\u002Fcard-800x500.png",{"path":665,"title":666,"description":667,"published":668,"category":495,"image":669,"draft":449},"\u002Fblog\u002Fhow-to-restore-a-supabase-backup","Як відновити резервну копію Supabase, і що ламається потім","Як відновити резервну копію Supabase з панелі або з файлу дампа, що саме замінює відновлення і чому ваш застосунок може лишитися зламаним після нього.","2026-08-24","\u002Fblog\u002Fhow-to-restore-a-supabase-backup\u002Fcard-800x500.png",{"path":671,"title":672,"description":673,"published":674,"category":445,"image":675,"draft":449},"\u002Fblog\u002Fsupabase-storage-bucket-public","Ваш бакет Supabase Storage публічний. Чи це проблема?","Публічний бакет Supabase Storage означає, що той, хто має URL файлу, може його відкрити. Він не означає, що хтось може переглянути список вмісту.","2026-08-23","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcard-800x500.png",{"path":677,"title":678,"description":679,"published":680,"category":445,"image":681,"draft":449},"\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend","Чи є проблемою ключ API Google у вашому браузері?","Ключ API Google у відкритому коді сторінки наш сканер знаходить найчастіше, і зазвичай усе гаразд. Вирішує це одне безкоштовне налаштування.","2026-08-22","\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":683,"title":684,"description":685,"published":686,"category":495,"image":687,"draft":449},"\u002Fblog\u002Fai-agent-deleted-my-database","ШІ-агент видалив мої дані в Supabase. Що можна відновити?","ШІ-агент видалив дані з вашої бази. Те, що ви зможете відновити, вирішилося раніше, а наступні хвилини вирішують, скільки з цього вціліє.","2026-08-21","\u002Fblog\u002Fai-agent-deleted-my-database\u002Fcard-800x500.png",{"path":295,"title":689,"description":690,"published":691,"category":445,"image":692,"draft":449},"Чи може будь-хто прочитати вашу базу Supabase? 3 680 застосунків","Чи може будь-хто прочитати вашу базу даних Supabase без входу? Ми просканували 30 998 живих застосунків, зроблених ШІ-білдерами, і виміряли, як часто так.","2026-08-18","\u002Fblog\u002Fcan-anyone-read-your-supabase-database\u002Fcard-800x500.png",{"path":694,"title":695,"description":696,"published":691,"category":445,"image":697,"draft":449},"\u002Fblog\u002Fsource-maps-exposed-in-production","Відкриті source maps: ваш застосунок публікує свій вихідний код","Відкрита source map дає будь-кому прочитати оригінальний код вашого застосунку, разом із коментарями. Перевірка за 30 секунд, і що важить насправді.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fcard-800x500.png",{"path":699,"title":700,"description":701,"published":702,"category":445,"image":703,"draft":449},"\u002Fblog\u002Fsupabase-new-api-keys","Нові API-ключі Supabase: який із них безпечний у застосунку?","Supabase замінив anon і service_role публічними та секретними ключами. Який із них має бути у вашому застосунку, а який не має бути ніколи?","2026-08-12","\u002Fblog\u002Fsupabase-new-api-keys\u002Fcard-800x500.png",{"path":339,"title":705,"description":706,"published":707,"category":495,"image":708,"draft":449},"Чи робить Supabase резервні копії моєї бази? Залежить від тарифу.","Чи робить Supabase резервні копії вашої бази даних? На платних тарифах щодня, на безкоштовному жодної. Як дізнатися, що у вас насправді є.","2026-08-11","\u002Fblog\u002Fdoes-supabase-back-up-my-database\u002Fcard-800x500.png",{"path":226,"title":710,"description":711,"published":712,"category":445,"image":713,"draft":449},"Supabase Row Level Security увімкнено. Таблиця досі публічна.","Увімкнути Supabase Row Level Security не означає захистити таблицю. Захищають політики, а та, що полагодила застосунок, часто впускає всіх.","2026-08-10","\u002Fblog\u002Fsupabase-rls-on-but-table-still-public\u002Fcard-800x500.png",{"path":715,"title":716,"description":717,"published":712,"category":495,"image":718,"draft":449},"\u002Fblog\u002Fversion-history-is-not-a-backup","Історія версій не є резервною копією. Вона не поверне таблицю.","Lovable і Bolt ведуть історію версій вашого коду. Ваша база даних працює як окремий сервіс, тож відкат назад не поверне ваші дані.","\u002Fblog\u002Fversion-history-is-not-a-backup\u002Fcard-800x500.png",{"path":720,"title":721,"description":722,"published":723,"category":495,"image":724,"draft":449},"\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database","Три способи зробити резервну копію бази Supabase, і чого бракує","Панель, pg_dump і керований сервіс. Що насправді зберігає кожен спосіб, що тихо лишає осторонь і який із них переживе втрату акаунта.","2026-08-09","\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database\u002Fcard-800x500.png",{"path":726,"title":727,"description":728,"published":723,"category":445,"image":729,"draft":449},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","Які API-ключі безпечні у браузері, а які ні","Ваш ключ anon у Supabase створений, щоб бути публічним. Ключ service_role для цього не створений, і він ігнорує всі правила, які ви задали. Як їх розрізнити.","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend\u002Fcard-800x500.png",1790150956272]