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