[{"data":1,"prerenderedAt":959},["ShallowReactive",2],{"blog-uk-storage-upload-violates-row-level-security":3,"blog-index-uk":602},{"id":4,"title":5,"body":6,"category":559,"cover":560,"coverAlt":561,"description":562,"draft":563,"extension":564,"faq":565,"image":580,"keywords":581,"meta":589,"navigation":590,"ogTitle":591,"path":592,"published":593,"seo":594,"stem":595,"tldr":596,"updated":593,"__hash__":601},"blog_uk\u002Fblog\u002Fstorage-upload-violates-row-level-security.md","\"Row-level security policy for table objects\" при вивантаженні",{"type":7,"value":8,"toc":546},"minimark",[9,13,24,31,39,44,51,57,70,74,77,87,99,105,109,112,118,121,129,133,136,142,153,156,172,179,260,263,268,272,275,278,284,290,293,299,313,320,327,331,334,340,349,356,363,366,372,385,390,396,400,403,406,409,419,423,426,435,455,464,481,484,488,533],[10,11,12],"p",{},"Ваш застосунок вивантажує файл. У попередньому перегляді вашого білдера це\nпрацювало, або працювало минулого тижня, а тепер кожна спроба повертається\nреченням про row-level security:",[14,15,20],"pre",{"className":16,"code":18,"language":19},[17],"language-text","new row violates row-level security policy for table \"objects\"\n","text",[21,22,18],"code",{"__ignoreMap":23},"",[10,25,26,27,30],{},"Майже все це речення здасться знайомим, якщо ви вже проходили таке на власній\nтаблиці. Інакшим є останнє слово, бо ",[21,28,29],{},"objects"," це не таблиця, яку створили ви.",[10,32,33,34,38],{},"Ось що посібник за посібником подає хибно: ",[35,36,37],"strong",{},"перше виправлення, яке ви\nзнайдете, це зробити бакет публічним, і для вивантажень воно не робить\nнічого."," Власна документація Supabase каже рівно це одним рядком. Цей\nперемикач лишає вивантаження відхиленим і відкриває файли, які вже там лежали.",[40,41,43],"h2",{"id":42},"що-означає-new-row-violates-row-level-security-policy-for-table-objects","Що означає \"new row violates row-level security policy for table objects\"",[10,45,46,47,50],{},"Ваше вивантаження дійшло до Supabase Storage, Storage запитав правила,\nпокладені на таблицю ",[21,48,49],{},"storage.objects",", чи можна впустити цей файл, не знайшов\nжодного, яке сказало б так, і відмовив.",[10,52,53,54,56],{},"Рядок із повідомлення справжній. Storage тримає в ",[21,55,49],{}," один рядок\nна кожен файл, який має, з іменем файлу, бакетом, у якому той лежить, і тим,\nхто його поклав. Записати файл означає записати цей рядок, тож правила на цій\nтаблиці вирішують, чи відбудеться вивантаження взагалі. Нічого не втрачено:\nжодного файлу не збережено, а решта бакета лежить точно так, як хвилину тому.",[10,58,59,60,63,64,69],{},"Формулювання походить від Postgres, бази даних під Supabase, і тому читається\nяк механіка. Воно несе код ",[21,61,62],{},"42501",", той самий, що й\n",[65,66,68],"a",{"href":67},"\u002Fblog\u002Fnew-row-violates-row-level-security-policy","відмова зберегти рядок в одній із ваших власних таблиць",".",[40,71,73],{"id":72},"чому-повідомлення-називає-objects-а-не-ваш-бакет","Чому повідомлення називає \"objects\", а не ваш бакет",[10,75,76],{},"Бо Storage тримає правила для всіх бакетів вашого проєкту на цій одній таблиці.",[10,78,79,80,82,83,86],{},"Бакет упорядковує файли. Власних правил він не має, і до нього не причеплено\nжодного редактора policy. ",[21,81,49],{}," це місце, де живуть правила, для\nвсіх ваших бакетів одразу, а ",[21,84,85],{},"bucket_id"," це її колонка. Тож правило, яке каже\n\"тільки в бакеті avatars\", пишеться як умова на цій колонці.",[10,88,89,90,93,94,96,97,69],{},"Саме тому не допомогло й табличне правило, яке ви написали минулого тижня.\nПравило на ",[21,91,92],{},"profiles"," це правило про рядки в ",[21,95,92],{},", а файл це рядок у\n",[21,98,49],{},[100,101],"diagram",{"alt":102,"caption":103,"src":104},"Три бакети поруч, від кожного стрілка вниз у широку панель із підписом storage.objects, що несе три фішки policy й назву колонки. Ліворуч, за пунктирною лінією, тьмяніша картка з підписом profiles має власні рядки й власну фішку insert, і жодна лінія не сполучає її ні з чим.","Кожен бакет вашого проєкту керується з тієї самої таблиці. Правила, написані на ваших власних таблицях, лишаються по той бік цієї лінії й ніколи не зустрічають файл.","\u002Fblog\u002Fstorage-upload-violates-row-level-security\u002Fone-table-every-bucket-1600x720.png",[40,106,108],{"id":107},"чи-треба-робити-бакет-публічним-щоб-вивантаження-працювало","Чи треба робити бакет публічним, щоб вивантаження працювало?",[10,110,111],{},"Ні. За бакетом стоять два різні питання, і перемикач відповідає тільки на одне.\nХто може винести файл, вирішує публічність. Хто може покласти файл усередину,\nце тема вашої помилки, і документація Supabase однозначна: налаштування туди не\nдістає. Зі сторінки про два види бакетів, прочитано 11 жовтня 2026:",[113,114,115],"blockquote",{},[10,116,117],{},"Контроль доступу і далі застосовується до інших видів операцій, зокрема до\nвивантаження, видалення, переміщення та копіювання.",[10,119,120],{},"Що публічність справді робить, сказано на тій самій сторінці так само ясно:\nбудь-хто, хто має адресу файлу, може відкрити його без входу. Більшого в цьому\nналаштуванні немає.",[10,122,123,124,128],{},"Тож перемкнути його означає опинитися в єдиному стані, якого ніхто не хоче.\nВивантаження і далі відхилене, бо вивантаження ніколи не було тим, чим\nналаштування керувало, а файли, які вже лежали в бакеті, тепер може відкрити\nбудь-хто, хто має їхні адреси.\n",[65,125,127],{"href":126},"\u002Fblog\u002Fsupabase-storage-bucket-public","Чого насправді коштує публічний бакет"," це\nокреме питання від цієї помилки, і його варто прочитати, перш ніж торкатися\nперемикача.",[40,130,132],{"id":131},"що-бакет-насправді-перевіряє-при-вивантаженні","Що бакет насправді перевіряє при вивантаженні",[10,134,135],{},"Одне правило, і зветься воно insert.",[10,137,138,139,141],{},"Сторінка Supabase про контроль доступу прямо називає стан за замовчуванням: без\npolicy Storage не дозволяє жодного вивантаження в бакет, а ви дозволяєте\nоперації по одній, записуючи їх на ",[21,140,49],{},". Далі вона називає ту, яка\nвам потрібна:",[113,143,144],{},[10,145,146,147,150,151,69],{},"Наприклад, єдина policy RLS, потрібна для вивантаження обʼєктів, це надати\nдозвіл ",[21,148,149],{},"INSERT"," на таблицю ",[21,152,49],{},[10,154,155],{},"У цього є друга половина, і вона найчастіша причина, чому правило insert не\nприбирає помилку:",[113,157,158],{},[10,159,160,161,164,165,168,169,69],{},"Щоб дозволити перезапис файлів через функціональність ",[21,162,163],{},"upsert",", вам\nдоведеться додатково надати дозволи ",[21,166,167],{},"SELECT"," та ",[21,170,171],{},"UPDATE",[10,173,174,175,178],{},"Якщо ваше вивантаження передає ",[21,176,177],{},"upsert: true",", що просить Storage замінити файл\nіз тим самим іменем, коли такий уже є, то правила insert самого по собі\nзамало. Замінити файл це три питання замість одного: чи можна вам додати цей\nрядок, чи можна побачити той, що вже є, і чи можна його змінити.",[180,181,182,197],"table",{},[183,184,185],"thead",{},[186,187,188,192],"tr",{},[189,190,191],"th",{},"Про що ваш застосунок просить Storage",[189,193,194,195],{},"Що йому потрібно на ",[21,196,49],{},[198,199,200,212,232,241,250],"tbody",{},[186,201,202,206],{},[203,204,205],"td",{},"вивантажити новий файл",[203,207,208,209],{},"правило ",[21,210,211],{},"insert",[186,213,214,220],{},[203,215,216,217,219],{},"замінити файл із тим самим іменем (",[21,218,163],{},")",[203,221,222,224,225,228,229],{},[21,223,211],{},", а ще ",[21,226,227],{},"select"," і ",[21,230,231],{},"update",[186,233,234,237],{},[203,235,236],{},"відкрити файл у приватному бакеті",[203,238,208,239],{},[21,240,227],{},[186,242,243,246],{},[203,244,245],{},"перелічити те, що лежить у бакеті",[203,247,208,248],{},[21,249,227],{},[186,251,252,255],{},[203,253,254],{},"видалити файл",[203,256,208,257],{},[21,258,259],{},"delete",[10,261,262],{},"Писати всі пʼять не треба. Пишіть ті, які ваш застосунок справді виконує, а для\nбільшості вивантажень це перший рядок і подекуди другий.",[100,264],{"alt":265,"caption":266,"src":267},"Склад файлів із кришкою і двома отворами в правій стіні. Верхній отвір перекрито засувом, і документ, що підходить ззовні, відкидає хрестик. У нижнього отвору засув піднято, і файл проходить крізь нього до постаті, яка чекає поруч із галочкою. Перемикач унизу сполучено однією лінією тільки з нижнім отвором і більше ні з чим.","Один склад, два отвори. Перемикач під'єднано до нижнього. Вивантаження приходить до верхнього, де правило, якого ще ніхто не написав, вирішує, чи пустити його.","\u002Fblog\u002Fstorage-upload-violates-row-level-security\u002Ftwo-counters-1600x720.png",[40,269,271],{"id":270},"правило-що-дає-вивантажувати-вашому-застосунку-і-тільки-йому","Правило, що дає вивантажувати вашому застосунку, і тільки йому",[10,273,274],{},"Назвіть бакет і скажіть, для кого правило діє.",[10,276,277],{},"Відправна точка документації обмежує вивантаження одним бакетом і відвідувачами\nз входом:",[14,279,282],{"className":280,"code":281,"language":19},[17],"create policy \"Allow authenticated uploads\"\non storage.objects\nfor insert\nto authenticated\nwith check (bucket_id = 'my_bucket_id');\n",[21,283,281],{"__ignoreMap":23},[10,285,286,289],{},[21,287,288],{},"to authenticated"," це частина, яку не варто пропускати. Вона означає, що\nправило стосується відвідувачів, які увійшли; заберіть її, і правило стосується\nвсіх, сторонніх зокрема.",[10,291,292],{},"Для всього, що належить конкретній людині, версія, яку публікує Supabase, кладе\nфайли кожної людини в теку, названу її іменем:",[14,294,297],{"className":295,"code":296,"language":19},[17],"create policy \"Allow authenticated uploads\"\non storage.objects\nfor insert\nto authenticated\nwith check (\n  bucket_id = 'my_bucket_id' and\n  (storage.foldername(name))[1] = (select auth.jwt()->>'sub')\n);\n",[21,298,296],{"__ignoreMap":23},[10,300,301,304,305,308,309,312],{},[21,302,303],{},"storage.foldername(name)"," розбиває шлях збереженого файлу на теки, тож ",[21,306,307],{},"[1]","\nце перша з них. ",[21,310,311],{},"auth.jwt()->>'sub'"," це id того, хто увійшов і робить запит.\nПрочитані разом, ці два рядки кажуть, що ви можете покласти файл у теку,\nназвану вашим іменем, у тому бакеті, і більше ніде.",[10,314,315,316,319],{},"Обидва ці приклади належать Supabase, а не нам, прочитано 11 жовтня 2026, із\n",[21,317,318],{},"my_bucket_id"," там, де вони його лишили, щоб ви бачили, яка частина є іменем\nвашого власного бакета.",[10,321,322,323,69],{},"Якщо ви радше подивилися б на результат ззовні, наше безкоштовне сканування\nпитає ваш живий проєкт, які з ваших бакетів віддадуть свій вміст сторонньому.\nВоно триває близько 20 секунд і не потребує облікового запису:\n",[65,324,326],{"href":325},"\u002Fsecurity-scanner","скануйте свій застосунок",[40,328,330],{"id":329},"що-правило-на-читання-віддає-хоч-його-й-не-просили","Що правило на читання віддає, хоч його й не просили",[10,332,333],{},"Перелічити бакет і завантажити з нього це той самий привілей, тож правило,\nнаписане, щоб запрацювали ваші завантаження, робить вміст бакета ще й\nперелічуваним.",[10,335,336,337,339],{},"Сторінка Supabase про допоміжні функції каже це прямо: один привілей SQL на\nкшталт ",[21,338,167],{}," використовують кілька дій Storage. Сторінка про контроль\nдоступу далі застерігає щодо конкретного випадку, під прикладом, який відкриває\nбакет з аватарами для всіх:",[113,341,342],{},[10,343,344,345,348],{},"Фільтр ",[21,346,347],{},"allow_any_operation()"," тут критичний, бо без нього користувачі змогли\nб перелічити вміст бакета.",[10,350,351,352,355],{},"Саме цю прогалину ми вимірюємо ззовні. Ми просканували 8 435 живих застосунків,\nщо називають проєкт Supabase. Перевірка бакетів дістала відповідь від 4 703 з\nних, і ",[35,353,354],{},"792 з цих відповіли на наш запит переліку іменами того, що лежало\nвсередині",", без жодного входу. Це приблизно один із шести застосунків, які ми\nзмогли запитати.",[10,357,358,359,362],{},"Часто досить і самого імені, бо бакет, який перелічує, позбавляє стороннього\nклопоту вгадувати імена файлів. ",[21,360,361],{},"invoice-2026-03-hannah.pdf"," каже, чий це файл,\nще до того, як його хтось відкриє.",[10,364,365],{},"Виправлення, яке документує Supabase, полягає в тому, щоб сказати, для якої дії\nStorage діє правило:",[14,367,370],{"className":368,"code":369,"language":19},[17],"create policy \"Allow users to list their own objects\"\non storage.objects\nfor select\nto authenticated\nusing (\n  storage.allow_only_operation('object.list')\n  and owner_id = (select auth.uid()::text)\n);\n",[21,371,369],{"__ignoreMap":23},[10,373,374,377,378,381,382,384],{},[21,375,376],{},"storage.allow_only_operation"," і сестринська ",[21,379,380],{},"storage.allow_any_operation"," це\nспосіб, у який правило ",[21,383,227],{}," звужується до однієї з дій, що ділять привілей.\nБез котроїсь із них правило, яке ви написали, щоб застосунок міг показати\nкартинку, це ще й правило, яке зачитає все, що є в бакеті.",[100,386],{"alt":387,"caption":388,"src":389},"Коробка з підписом select, від якої відходять дві гілки. Верхня гілка доходить до одного документа, що його передають постаті поруч із галочкою. Нижня гілка проходить крізь вузьку пластину, намальовану пунктиром, і доходить до стосу з шести підсвічених рядків, позначеного хрестиком.","Одне правило, дві різні дії Storage. Пластина на нижньому шляху це фільтр дії, а пунктир показує, який вона має вигляд, коли ніхто його не написав.","\u002Fblog\u002Fstorage-upload-violates-row-level-security\u002Fone-rule-two-actions-1600x700.png",[10,391,392,395],{},[65,393,394],{"href":126},"Чи є перелічуваний бакет проблемою для вашого застосунку",",\nзалежить від того, що в ньому лежить, і на це результат сканування за вас не\nвідповість.",[40,397,399],{"id":398},"коли-публічність-це-правильна-відповідь","Коли публічність це правильна відповідь",[10,401,402],{},"Коли файли й задумані так, щоб їх бачив кожен, хто попросить, і це справжня\nкатегорія, до якої Supabase наводить власні приклади.",[10,404,405],{},"Приклади використання, які Supabase наводить для публічного бакета, це аватари,\nпублічні медіа та вміст дописів у блозі. Це файли, які ваш застосунок показує\nвідвідувачу без входу, і віддавати їх із публічного бакета ще й швидше, бо два\nвиди бакетів кешуються по-різному.",[10,407,408],{},"Для іншого виду документація називає два способи дістати файл із приватного\nбакета: завантаження з токеном людини, яка увійшла, або підписане посилання, що\nпрацює обмежений час. Обидва лишають рішення за вашими правилами, а не за тим,\nхто знайшов адресу.",[410,411,413],"callout",{"type":412},"warn",[10,414,415,418],{},[35,416,417],{},"Бакети приватні за замовчуванням."," Бакет, який ви створили й більше про\nнього не думали, уже перебуває в суворішому з двох станів, а отже помилка, яку\nви читаєте, це передбачена поведінка. Напишіть правило, і вивантаження пройде;\nперемикач у цьому питанні не має голосу ні так, ні так.",[40,420,422],{"id":421},"як-тримати-бакет-правильним-після-сьогодні","Як тримати бакет правильним після сьогодні",[10,424,425],{},"Коли правила вже коректні, рухаються ще дві речі: хтось перемикає перемикач,\nполюючи на зовсім іншу ваду, і зникає файл.",[10,427,428],{},[35,429,430,434],{},[65,431,433],{"href":432},"\u002Fpricing","Reeve Monitor"," проганяє дев'ять зовнішніх перевірок за вас знову:",[436,437,438,442,445,452],"ul",{},[439,440,441],"li",{},"усі дев'ять перевірок щогодини, на щонайбільше трьох застосунках, разом із переліком бакетів",[439,443,444],{},"чи застосунок відповідає, кожні 60 секунд",[439,446,447,448,451],{},"повідомлення, коли результат ",[35,449,450],{},"змінюється",", щоб бакет, який відкрився вночі, не чекав, поки ви подивитеся",[439,453,454],{},"щомісячний звіт про побачене",[10,456,457],{},[35,458,459,463],{},[65,460,462],{"href":461},"\u002Fsupabase-backups","Reeve Care"," тримає копію того, що там лежить:",[436,465,466,469,472,475,478],{},[439,467,468],{},"зашифрована копія вашої бази Supabase щоночі, складена там, куди ваш проєкт не дістане",[439,470,471],{},"кожна копія перевірена, перш ніж її зарахувати, підрахунком рядків у кожній таблиці",[439,473,474],{},"а також ваші вивантажені файли, щойно ви підключите доступ до Storage",[439,476,477],{},"відновлення в один клік, коли воно вам знадобиться",[439,479,480],{},"усе, що робить Monitor",[10,482,483],{},"Обидва є на сторінці цін, яка іноді нижча за вказану тут і ніколи не вища.",[40,485,487],{"id":486},"що-зробити-сьогодні","Що зробити сьогодні",[489,490,491],"key-takeaways",{},[436,492,493,496,512,522,525],{},[439,494,495],{},"Читайте повідомлення як відмову. Файл не збережено, бакет незмінний, і відновлювати нічого не треба.",[439,497,498,499,501,502,504,505,507,508,511],{},"Додайте правило ",[21,500,211],{}," на ",[21,503,49],{},", яке називає ваш бакет у ",[21,506,85],{}," і несе ту клаузу ",[21,509,510],{},"TO",", яку ви мали на увазі.",[439,513,174,514,516,517,228,519,521],{},[21,515,177],{},", додайте ще ",[21,518,227],{},[21,520,231],{},", інакше саме лише правило insert помилку не прибере.",[439,523,524],{},"Поки це робите, лишіть перемикач публічності там, де він є. Щодо вивантажень він голосу не має, а щодо того, хто може відкрити вже збережене, має цілком.",[439,526,527,528,501,530,532],{},"Перечитайте кожне правило ",[21,529,227],{},[21,531,49],{}," і спитайте, що воно дозволяє, окрім завантаження, заради якого ви його написали. Перелік ділить цей привілей.",[10,534,535,536,540,541,545],{},"Почніть із бакета, з якого прийшла помилка, а тоді подивіться на інші бакети в\nтому самому проєкті, бо одного разу широко написане правило зазвичай вставлено\nдвічі. ",[65,537,539],{"href":538},"\u002Fchecklist","Десятихвилинний чек-лист безпеки"," охоплює те, що ще\nлишається відкритим у щойно запущеному застосунку, а\n",[65,542,544],{"href":543},"\u002Fis-your-supabase-app-safe","довідник з безпеки Supabase"," проходить рештою\nтого, до чого може дістатися сторонній.",{"title":23,"searchDepth":547,"depth":547,"links":548},3,[549,551,552,553,554,555,556,557,558],{"id":42,"depth":550,"text":43},2,{"id":72,"depth":550,"text":73},{"id":107,"depth":550,"text":108},{"id":131,"depth":550,"text":132},{"id":270,"depth":550,"text":271},{"id":329,"depth":550,"text":330},{"id":398,"depth":550,"text":399},{"id":421,"depth":550,"text":422},{"id":486,"depth":550,"text":487},"Основи безпеки","\u002Fblog\u002Fstorage-upload-violates-row-level-security\u002Fcover-1200x630.png","Віконце прийому із засувом і документ, що лишився назовні, а позаду стелаж із файлами з кришкою над верхнім краєм.","\"New row violates row-level security policy for table objects\" означає, що вашому вивантаженню бракує правила insert. Публічний бакет його не додає.",false,"md",[566,569,571,574,577],{"q":567,"a":568},"Чому моє вивантаження в Supabase падає з помилкою row-level security?","Бо Supabase Storage запитав правила, покладені на таблицю storage.objects, чи можна впустити ваш файл, і не знайшов жодного, яке сказало б так. Storage записує в цю таблицю один рядок на кожен файл, який тримає, і Row Level Security діє на цей рядок так само, як на рядок будь-якої іншої таблиці. Жодного файлу не збережено, і нічого з того, що вже лежало в бакеті, не змінилося. Повідомлення несе код Postgres 42501, той самий, що й при відмові зберегти рядок у вашій власній таблиці.",{"q":108,"a":570},"Ні, і публічність не допоможе. Supabase документує, що контроль доступу і далі діє на вивантаження, видалення, переміщення та копіювання, у якому б стані не був бакет. Публічність змінює одну річ: чи може той, хто має адресу файлу, відкрити цей файл без входу. Тобто перемикач лишає ваше вивантаження відхиленим і робить файли, які вже там лежали, доступними кожному, хто має їхню адресу.",{"q":572,"a":573},"Які policy потрібні бакету?","Вивантаженню потрібне одне правило insert на storage.objects. Якщо ваш код замінює файли з тим самим іменем, а саме це робить upsert, Supabase каже, що потрібні ще select і update. Відкрити файл у приватному бакеті потребує правила select, і перелічити вміст бакета теж, бо обидві ці дії Storage працюють на одному привілеї SQL. Видалення потребує правила delete. Писати всі чотири не обовʼязково, лише ті, які ваш застосунок справді виконує.",{"q":575,"a":576},"Чи небезпечний публічний бакет?","Це цілком залежить від того, що в ньому лежить. Публічний це правильне налаштування для аватарів, логотипів і всього іншого, що ваш застосунок показує відвідувачу без входу, і саме це Supabase наводить як власні приклади використання. Це хибне налаштування для рахунків, експортів чи будь-чого, що належить конкретній людині, і для такого вам потрібен приватний бакет із підписаним посиланням. Питання ніколи не стояло так, чи публічність це погано.",{"q":578,"a":579},"Як перевірити, чи мій бакет можна перелічити?","Запитайте його ззовні, без жодного входу, точно як це зробив би сторонній. Перелік дає правило select, а не перемикач публічності, тож ні перемикач у панелі, ні погляд на список ваших policy на це не відповідають. Наше безкоштовне сканування робить це на вашому живому проєкті й каже, які з ваших бакетів відповіли іменами того, що лежало всередині.","\u002Fblog\u002Fstorage-upload-violates-row-level-security\u002Fcard-800x500.png",[582,583,584,585,586,587,588],"new row violates row-level security policy for table objects","помилка rls вивантаження supabase storage","supabase storage policy вивантаження","supabase bucket upload 403","storage objects rls supabase","supabase вивантаження доступ заборонено","приклад policy supabase storage",{},true,"\"Row-level security policy for table objects\"","\u002Fblog\u002Fstorage-upload-violates-row-level-security","2026-10-11",{"title":5,"description":562},"blog\u002Fstorage-upload-violates-row-level-security",[597,598,599,600],"\"New row violates row-level security policy for table objects\" означає, що ваше вивантаження дійшло до Supabase Storage і жодне правило на storage.objects не пустило файл усередину. Файл не збережено, а решта бакета лишилася недоторканою.","Storage тримає свої правила на одній таблиці для всіх бакетів вашого проєкту, і саме тому повідомлення називає таблицю, якої ви ніколи не створювали.","Зробити бакет публічним це не виправить. Supabase перевіряє вивантаження в обох випадках, а публічність вирішує тільки те, хто може відкрити файл, адресу якого вже має.","Вивантаженню потрібне правило insert на storage.objects. Якщо ваш код зберігає через upsert, йому потрібні ще select і update.","mPZo2L6L4rCETVT2DEO_ntKsORvp5tYapA5cplugZSY",[603,604,610,616,622,628,634,640,646,652,658,664,670,676,683,689,695,700,706,712,718,724,730,736,742,748,754,760,766,772,778,784,790,796,802,808,814,820,826,832,838,844,850,856,862,868,874,879,885,891,897,902,908,914,920,925,931,937,943,948,954],{"path":592,"title":5,"description":562,"published":593,"category":559,"image":580,"draft":563},{"path":605,"title":606,"description":607,"published":608,"category":559,"image":609,"draft":563},"\u002Fblog\u002Fbase44-security-scan","Сканування безпеки Base44: те, що бачить лише воно","Сканування безпеки Base44 перевіряє сім видів проблем зсередини. Ось половина, яку читає тільки воно, і половина, на яку воно ніколи не дивиться.","2026-10-10","\u002Fblog\u002Fbase44-security-scan\u002Fcard-800x500.png",{"path":611,"title":612,"description":613,"published":614,"category":559,"image":615,"draft":563},"\u002Fblog\u002Fapi-key-leaked-what-to-do","Ваш API-ключ витік. Порядок дій","API-ключ витік, і ви не знаєте, що робити першим. Не кожен ключ у вашому фронтенді є витоком, а порядок важить більше за швидкість.","2026-10-09","\u002Fblog\u002Fapi-key-leaked-what-to-do\u002Fcard-800x500.png",{"path":617,"title":618,"description":619,"published":620,"category":559,"image":621,"draft":563},"\u002Fblog\u002Finfinite-recursion-in-policy-for-relation","\"Infinite recursion detected in policy\" без вимкнення RLS","\"Infinite recursion detected in policy for relation\" означає, що ваша policy запитала таблицю, яку вона захищає. Ось як розірвати коло.","2026-10-08","\u002Fblog\u002Finfinite-recursion-in-policy-for-relation\u002Fcard-800x500.png",{"path":623,"title":624,"description":625,"published":626,"category":559,"image":627,"draft":563},"\u002Fblog\u002Fno-api-key-found-in-request","\"No API key found in request\" у Supabase, і хибне виправлення","\"No API key found in request\" означає, що запит дійшов до Supabase без ключа. Більшість відповідей натомість вказують на правила вашої бази.","2026-10-07","\u002Fblog\u002Fno-api-key-found-in-request\u002Fcard-800x500.png",{"path":629,"title":630,"description":631,"published":632,"category":559,"image":633,"draft":563},"\u002Fblog\u002Fis-base44-safe","Чи безпечний Base44? Дані 5 442 застосунків","Чи безпечний Base44? Ми прогнали дев’ять перевірок на 5 442 робочих застосунках Base44. Майже всі отримали B з причин, яких власник ніколи не обирав.","2026-10-06","\u002Fblog\u002Fis-base44-safe\u002Fcard-800x500.png",{"path":635,"title":636,"description":637,"published":638,"category":559,"image":639,"draft":563},"\u002Fblog\u002Fmove-a-secret-to-an-edge-function","Сховати ключ API: перенесіть його в Supabase Edge Function","Сховати ключ API означає прибрати його з браузера, а Supabase Edge Function це найменше місце, куди його покласти. Два кроки поруч важать більше.","2026-10-05","\u002Fblog\u002Fmove-a-secret-to-an-edge-function\u002Fcard-800x500.png",{"path":641,"title":642,"description":643,"published":644,"category":559,"image":645,"draft":563},"\u002Fblog\u002Fenv-file-exposed-on-your-server","Чи відкритий ваш файл .env? Дванадцять шляхів для перевірки","Чи відкритий ваш файл .env на вашому власному вебсервері? Дванадцять адрес скажуть це за хвилину, а влучання означає, що все в ньому вже публічне.","2026-10-04","\u002Fblog\u002Fenv-file-exposed-on-your-server\u002Fcard-800x500.png",{"path":647,"title":648,"description":649,"published":650,"category":559,"image":651,"draft":563},"\u002Fblog\u002Fis-v0-safe","Безпека v0: усі 1 790 просканованих застосунків v0 отримали A","Безпека v0 на 1 790 живих застосунках v0: усі отримали A. Лише 17 згадували базу даних, і саме це здебільшого вимірює оцінка A.","2026-10-03","\u002Fblog\u002Fis-v0-safe\u002Fcard-800x500.png",{"path":653,"title":654,"description":655,"published":656,"category":559,"image":657,"draft":563},"\u002Fblog\u002Fis-bolt-safe","Чи безпечний Bolt? Що показали 1 123 застосунки Bolt","Чи безпечний Bolt? Ми прогнали 1 123 живі застосунки Bolt через дев’ять перевірок. Хостинг був чистим. Знахідки: ключі й відкриті таблиці в самих застосунках.","2026-10-02","\u002Fblog\u002Fis-bolt-safe\u002Fcard-800x500.png",{"path":659,"title":660,"description":661,"published":662,"category":559,"image":663,"draft":563},"\u002Fblog\u002Fis-supabase-down-or-your-app","Supabase не працює чи проблема у вашому застосунку? Як розрізнити","Supabase не працює чи зламався ваш застосунок? Пауза, повна база й ваша власна помилка виглядають однаково. Чотири перевірки їх розрізняють.","2026-10-01","\u002Fblog\u002Fis-supabase-down-or-your-app\u002Fcard-800x500.png",{"path":665,"title":666,"description":667,"published":668,"category":559,"image":669,"draft":563},"\u002Fblog\u002Fdoes-supabase-encrypt-my-data","Чи шифрує Supabase мої дані? Так. Ось від чого це захищає","Чи шифрує Supabase дані? Так: AES-256 у стані спокою, TLS під час передавання, SOC 2 та ISO 27001. Що покриває кожне і який витік не зупиняє жодне.","2026-09-30","\u002Fblog\u002Fdoes-supabase-encrypt-my-data\u002Fcard-800x500.png",{"path":671,"title":672,"description":673,"published":674,"category":559,"image":675,"draft":563},"\u002Fblog\u002Fsupabase-free-plan-limits","Ліміти безкоштовного тарифу Supabase і що стається на кожному","Ліміти безкоштовного тарифу Supabase: 500 МБ бази, 5 ГБ egress і жодних резервних копій. Що стається на кожній межі і що змінює Pro за $25.","2026-09-29","\u002Fblog\u002Fsupabase-free-plan-limits\u002Fcard-800x500.png",{"path":677,"title":678,"description":679,"published":680,"category":681,"image":682,"draft":563},"\u002Fblog\u002Ftest-your-supabase-backup","Перевірте резервну копію Supabase до того, як вона знадобиться","Як перевірити резервну копію Supabase: відновити в тестовий проєкт, порахувати рядки, увійти й знайти рядок, якого бракує обрізаному файлу.","2026-09-28","Backups","\u002Fblog\u002Ftest-your-supabase-backup\u002Fcard-800x500.png",{"path":684,"title":685,"description":686,"published":687,"category":681,"image":688,"draft":563},"\u002Fblog\u002Fsupabase-backup-github-action","Безкоштовна резервна копія Supabase через GitHub Action і підступ","Резервна копія Supabase через GitHub Action безкоштовна й годиться багатьом застосункам. Робочий процес, потрібний рядок підключення та egress.","2026-09-27","\u002Fblog\u002Fsupabase-backup-github-action\u002Fcard-800x500.png",{"path":690,"title":691,"description":692,"published":693,"category":681,"image":694,"draft":563},"\u002Fblog\u002Fdownload-your-supabase-backup","Чому ви не можете завантажити резервну копію Supabase","Завантажити резервну копію Supabase на сучасному проєкті не вийде: щоденна копія там фізична. Як це перевірити і як тримати власну копію.","2026-09-26","\u002Fblog\u002Fdownload-your-supabase-backup\u002Fcard-800x500.png",{"path":696,"title":697,"description":698,"published":693,"category":559,"image":699,"draft":563},"\u002Fblog\u002Fsupabase-permission-denied-for-table","Supabase \"permission denied for table\": бракує GRANT","З 30 жовтня нова таблиця в Supabase відповідає \"permission denied for table\", доки ви не дасте доступ. Лист показує лише половину виправлення.","\u002Fblog\u002Fsupabase-permission-denied-for-table\u002Fcard-800x500.png",{"path":701,"title":702,"description":703,"published":704,"category":559,"image":705,"draft":563},"\u002Fblog\u002Fopen-api-endpoint-exposed","Чи є відкритий API-ендпоінт проблемою безпеки? Читайте JSON","Ваше сканування позначило відкритий API-ендпоінт. Чи це важливо, залежить від того, що повернулося, і більшість знайдених належали платформі.","2026-09-25","\u002Fblog\u002Fopen-api-endpoint-exposed\u002Fcard-800x500.png",{"path":707,"title":708,"description":709,"published":710,"category":559,"image":711,"draft":563},"\u002Fblog\u002Flovable-security-scan","Сканування безпеки Lovable: чого воно не доведе","Сканування безпеки Lovable: що перевіряють Quick scan і Deep scan, коли запускається кожне, і єдине, чого не доведе жодне сканування зсередини.","2026-09-24","\u002Fblog\u002Flovable-security-scan\u002Fcard-800x500.png",{"path":713,"title":714,"description":715,"published":716,"category":681,"image":717,"draft":563},"\u002Fblog\u002Fsupabase-backup-auth-users","Чому у вашому дампі Supabase немає користувачів","Запустіть supabase db dump окремо і отримаєте форму вашої бази та жодного її рядка, без схеми auth, у якій живуть ваші користувачі.","2026-09-23","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":719,"title":720,"description":721,"published":722,"category":559,"image":723,"draft":563},"\u002Fblog\u002Fdomain-and-certificate-expiry","Домен закінчився, сайт лежить: що буде далі","Ваш домен закінчився і сайт лежить. Ось який годинник уже пішов, чому прострочений сертифікат це менша з двох бід, і як перевірити обидва.","2026-09-22","\u002Fblog\u002Fdomain-and-certificate-expiry\u002Fcard-800x500.png",{"path":725,"title":726,"description":727,"published":728,"category":559,"image":729,"draft":563},"\u002Fblog\u002Fis-lovable-safe","Чи безпечний Lovable? Що показали 18 554 застосунки Lovable","Чи безпечний Lovable? Ми прогнали 18 554 живі застосунки Lovable через дев’ять перевірок. Платформа виявилася найчистішою з п’яти. Знахідки були в застосунках.","2026-09-21","\u002Fblog\u002Fis-lovable-safe\u002Fcard-800x500.png",{"path":731,"title":732,"description":733,"published":734,"category":559,"image":735,"draft":563},"\u002Fblog\u002Fvibe-coded-app-security-checklist","Чек-лист безпеки для vibe coding, у девʼяти перевірках","Чек-лист безпеки для vibe coding із девʼяти пунктів, кожен з яких будь-хто може перевірити у вашому живому застосунку ззовні, і кожен має тест на один рядок.","2026-09-20","\u002Fblog\u002Fvibe-coded-app-security-checklist\u002Fcard-800x500.png",{"path":737,"title":738,"description":739,"published":740,"category":559,"image":741,"draft":563},"\u002Fblog\u002Fstripe-secret-key-in-frontend","Секретний ключ Stripe у фронтенді може рухати гроші","Секретний ключ Stripe, відкритий у вашому фронтенді, може повертати кошти, списувати й читати кожну картку клієнта. А ключ pk_live_ там і має бути.","2026-09-19","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Fcard-800x500.png",{"path":743,"title":744,"description":745,"published":746,"category":559,"image":747,"draft":563},"\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":749,"title":750,"description":751,"published":752,"category":559,"image":753,"draft":563},"\u002Fblog\u002Fbase44-source-maps","Безпека Base44: що позначає скан і що з цього виправляти вам","Безпека Base44 на 5 438 просканованих застосунках: три знахідки майже на кожному належать платформі, source map є бейджем Base44, а ваша частина коротка.","2026-09-17","\u002Fblog\u002Fbase44-source-maps\u002Fcard-800x500.png",{"path":755,"title":756,"description":757,"published":758,"category":559,"image":759,"draft":563},"\u002Fblog\u002Fis-cursor-ai-safe","Чи безпечний Cursor AI? Редактор, код і опублікований застосунок","Чи безпечний Cursor AI? Три запитання в одному пошуку: що Cursor зберігає, у чому помиляється його код і чи відкритий застосунок, який ви опублікували.","2026-09-16","\u002Fblog\u002Fis-cursor-ai-safe\u002Fcard-800x500.png",{"path":761,"title":762,"description":763,"published":764,"category":559,"image":765,"draft":563},"\u002Fblog\u002Fis-replit-safe","Чи безпечний Replit? Що ми знайшли в 3 042 живих застосунках Replit","Чи безпечний Replit? Ми прогнали 3 042 живі застосунки Replit через дев’ять зовнішніх перевірок. Знахідки були в опублікованому застосунку, а не в хостингу.","2026-09-15","\u002Fblog\u002Fis-replit-safe\u002Fcard-800x500.png",{"path":767,"title":768,"description":769,"published":770,"category":681,"image":771,"draft":563},"\u002Fblog\u002Fsupabase-storage-backup","Supabase storage backup: у копії бази даних немає жодного файлу","Supabase storage backup це окрема робота. Копії бази даних зберігають список ваших файлів і жодного з них, тож після відновлення кожне завантаження зламане.","2026-09-14","\u002Fblog\u002Fsupabase-storage-backup\u002Fcard-800x500.png",{"path":773,"title":774,"description":775,"published":776,"category":681,"image":777,"draft":563},"\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":779,"title":780,"description":781,"published":782,"category":681,"image":783,"draft":563},"\u002Fblog\u002Fsupabase-project-paused-recover","Проєкт Supabase на паузі? Ваші дані нікуди не зникли","Supabase поставив ваш проєкт на паузу після тижня без активності. Нічого не видалено, кнопка Restore стоїть поруч із назвою, і у вас є рік, щоб натиснути.","2026-09-12","\u002Fblog\u002Fsupabase-project-paused-recover\u002Fcard-800x500.png",{"path":785,"title":786,"description":787,"published":788,"category":559,"image":789,"draft":563},"\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":791,"title":792,"description":793,"published":794,"category":559,"image":795,"draft":563},"\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":797,"title":798,"description":799,"published":800,"category":559,"image":801,"draft":563},"\u002Fblog\u002Fsupabase-rls-disabled-in-public","Supabase \"RLS disabled in public\": чого не бачить попередження","Supabase позначає \"RLS disabled in public\" як помилку. Про політику читання, яка лишає вашу таблицю так само відкритою, він не каже нічого.","2026-09-09","\u002Fblog\u002Fsupabase-rls-disabled-in-public\u002Fcard-800x500.png",{"path":803,"title":804,"description":805,"published":806,"category":559,"image":807,"draft":563},"\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":809,"title":810,"description":811,"published":812,"category":559,"image":813,"draft":563},"\u002Fblog\u002Fvibe-coding-security-scanners-compared","Сканери безпеки для vibe coding у порівнянні, наш теж","Найкращий сканер безпеки для vibe coding залежить від трьох питань, на які не відповідає жоден перелік функцій. Десять інструментів і ціни.","2026-09-07","\u002Fblog\u002Fvibe-coding-security-scanners-compared\u002Fcard-800x500.png",{"path":815,"title":816,"description":817,"published":818,"category":559,"image":819,"draft":563},"\u002Fblog\u002Fsupabase-security-checker","Supabase security checker: п’ять перевірок, які зробите самі","Supabase security checker читає ваш опублікований застосунок, а не налаштування проєкту. Ось п’ять перевірок і як виконати кожну самостійно.","2026-09-06","\u002Fblog\u002Fsupabase-security-checker\u002Fcard-800x500.png",{"path":821,"title":822,"description":823,"published":824,"category":559,"image":825,"draft":563},"\u002Fblog\u002Fvibe-coding-security-scanner","Сканер безпеки для vibe coding: чого не бачить скан URL","Сканер безпеки для vibe coding читає ваш робочий застосунок ззовні. Що це охоплює, чотири речі, яких він не бачить, і як читати результат.","2026-09-05","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fcard-800x500.png",{"path":827,"title":828,"description":829,"published":830,"category":559,"image":831,"draft":563},"\u002Fblog\u002Fmissing-security-headers","Відсутні заголовки безпеки: коли це справді важливо","Відсутні заголовки безпеки трапляються в наших звітах найчастіше. Від чого вони захищають і коли це найменш терміновий рядок вашого звіту.","2026-09-04","\u002Fblog\u002Fmissing-security-headers\u002Fcard-800x500.png",{"path":833,"title":834,"description":835,"published":836,"category":559,"image":837,"draft":563},"\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":839,"title":840,"description":841,"published":842,"category":559,"image":843,"draft":563},"\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":845,"title":846,"description":847,"published":848,"category":681,"image":849,"draft":563},"\u002Fblog\u002Fsupabase-backup-tools-compared","Інструменти резервного копіювання Supabase, і наш серед них","Чотири види інструментів резервного копіювання Supabase, що копіює кожен і коли безкоштовна GitHub Action виграє в будь-якої оплати, нашої теж.","2026-09-01","\u002Fblog\u002Fsupabase-backup-tools-compared\u002Fcard-800x500.png",{"path":851,"title":852,"description":853,"published":854,"category":559,"image":855,"draft":563},"\u002Fblog\u002Freplit-secrets-explained","Як користуватися секретами в Replit і що все одно публікується","Як користуватися секретами в Replit: додати, прочитати і усунути дві причини undefined. А ще ключі, які цей інструмент не здатен зберегти в таємниці.","2026-08-31","\u002Fblog\u002Freplit-secrets-explained\u002Fcard-800x500.png",{"path":857,"title":858,"description":859,"published":860,"category":681,"image":861,"draft":563},"\u002Fblog\u002Fback-up-supabase-free-tier","Резервні копії на безкоштовному тарифі Supabase без терміналу","На безкоштовному тарифі Supabase резервних копій немає: копію робите ви. Як зробити її з панелі та що втрачає шлях через CSV.","2026-08-30","\u002Fblog\u002Fback-up-supabase-free-tier\u002Fcard-800x500.png",{"path":863,"title":864,"description":865,"published":866,"category":559,"image":867,"draft":563},"\u002Fblog\u002Fis-supabase-secure","Чи безпечний Supabase? Так. Ваш проєкт це інше питання","Чи безпечний Supabase? Платформа проходить аудити, шифрує дані й тримає пентести. Їхня документація каже, де це закінчується і починаються ваші налаштування.","2026-08-29","\u002Fblog\u002Fis-supabase-secure\u002Fcard-800x500.png",{"path":869,"title":870,"description":871,"published":872,"category":559,"image":873,"draft":563},"\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":67,"title":875,"description":876,"published":877,"category":559,"image":878,"draft":563},"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":880,"title":881,"description":882,"published":883,"category":559,"image":884,"draft":563},"\u002Fblog\u002Fcors-wildcard-security-risk","Чи є вайлдкард CORS ризиком для безпеки? Майже ніколи.","Чи є вайлдкард CORS ризиком для безпеки? Зазвичай це типове налаштування вашого білдера, і воно не видає нічого, що ваш сервер і так віддавав кожному.","2026-08-26","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fcard-800x500.png",{"path":886,"title":887,"description":888,"published":889,"category":681,"image":890,"draft":563},"\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":892,"title":893,"description":894,"published":895,"category":681,"image":896,"draft":563},"\u002Fblog\u002Fhow-to-restore-a-supabase-backup","Як відновити резервну копію Supabase, і що ламається потім","Як відновити резервну копію Supabase з панелі або з файлу дампа, що саме замінює відновлення і чому ваш застосунок може лишитися зламаним після нього.","2026-08-24","\u002Fblog\u002Fhow-to-restore-a-supabase-backup\u002Fcard-800x500.png",{"path":126,"title":898,"description":899,"published":900,"category":559,"image":901,"draft":563},"Ваш бакет Supabase Storage публічний. Чи це проблема?","Публічний бакет Supabase Storage означає, що той, хто має URL файлу, може його відкрити. Він не означає, що хтось може переглянути список вмісту.","2026-08-23","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcard-800x500.png",{"path":903,"title":904,"description":905,"published":906,"category":559,"image":907,"draft":563},"\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":909,"title":910,"description":911,"published":912,"category":681,"image":913,"draft":563},"\u002Fblog\u002Fai-agent-deleted-my-database","ШІ-агент видалив мої дані в Supabase. Що можна відновити?","ШІ-агент видалив дані з вашої бази. Те, що ви зможете відновити, вирішилося раніше, а наступні хвилини вирішують, скільки з цього вціліє.","2026-08-21","\u002Fblog\u002Fai-agent-deleted-my-database\u002Fcard-800x500.png",{"path":915,"title":916,"description":917,"published":918,"category":559,"image":919,"draft":563},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","Чи може будь-хто прочитати вашу базу Supabase? 3 680 застосунків","Чи може будь-хто прочитати вашу базу даних Supabase без входу? Ми просканували 30 998 живих застосунків, зроблених ШІ-білдерами, і виміряли, як часто так.","2026-08-18","\u002Fblog\u002Fcan-anyone-read-your-supabase-database\u002Fcard-800x500.png",{"path":921,"title":922,"description":923,"published":918,"category":559,"image":924,"draft":563},"\u002Fblog\u002Fsource-maps-exposed-in-production","Відкриті source maps: ваш застосунок публікує свій вихідний код","Відкрита source map дає будь-кому прочитати оригінальний код вашого застосунку, разом із коментарями. Перевірка за 30 секунд, і що важить насправді.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fcard-800x500.png",{"path":926,"title":927,"description":928,"published":929,"category":559,"image":930,"draft":563},"\u002Fblog\u002Fsupabase-new-api-keys","Нові API-ключі Supabase: який із них безпечний у застосунку?","Supabase замінив anon і service_role публічними та секретними ключами. Який із них має бути у вашому застосунку, а який не має бути ніколи?","2026-08-12","\u002Fblog\u002Fsupabase-new-api-keys\u002Fcard-800x500.png",{"path":932,"title":933,"description":934,"published":935,"category":681,"image":936,"draft":563},"\u002Fblog\u002Fdoes-supabase-back-up-my-database","Чи робить Supabase резервні копії моєї бази? Залежить від тарифу.","Чи робить Supabase резервні копії вашої бази даних? На платних тарифах щодня, на безкоштовному жодної. Як дізнатися, що у вас насправді є.","2026-08-11","\u002Fblog\u002Fdoes-supabase-back-up-my-database\u002Fcard-800x500.png",{"path":938,"title":939,"description":940,"published":941,"category":559,"image":942,"draft":563},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","Supabase Row Level Security увімкнено. Таблиця досі публічна.","Увімкнути Supabase Row Level Security не означає захистити таблицю. Захищають політики, а та, що полагодила застосунок, часто впускає всіх.","2026-08-10","\u002Fblog\u002Fsupabase-rls-on-but-table-still-public\u002Fcard-800x500.png",{"path":944,"title":945,"description":946,"published":941,"category":681,"image":947,"draft":563},"\u002Fblog\u002Fversion-history-is-not-a-backup","Історія версій не є резервною копією. Вона не поверне таблицю.","Lovable і Bolt ведуть історію версій вашого коду. Ваша база даних працює як окремий сервіс, тож відкат назад не поверне ваші дані.","\u002Fblog\u002Fversion-history-is-not-a-backup\u002Fcard-800x500.png",{"path":949,"title":950,"description":951,"published":952,"category":681,"image":953,"draft":563},"\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":955,"title":956,"description":957,"published":952,"category":559,"image":958,"draft":563},"\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",1791705965375]