[{"data":1,"prerenderedAt":782},["ShallowReactive",2],{"blog-uk-base44-source-maps":3,"blog-index-uk":540},{"id":4,"title":5,"body":6,"category":498,"cover":499,"coverAlt":500,"description":501,"draft":502,"extension":503,"faq":504,"image":520,"keywords":521,"meta":529,"navigation":530,"ogTitle":5,"path":531,"published":532,"seo":533,"stem":534,"tldr":535,"updated":532,"__hash__":539},"blog_uk\u002Fblog\u002Fbase44-source-maps.md","Безпека Base44: що позначає скан і що з цього виправляти вам",{"type":7,"value":8,"toc":487},"minimark",[9,13,21,24,29,32,41,170,173,176,179,183,186,197,205,211,214,217,220,228,232,235,242,250,257,265,269,272,288,294,304,309,313,316,343,346,429,433,465,468,475],[10,11,12],"p",{},"Ви просканували свій застосунок на Base44, і звіт повернувся з оцінкою B і\nтрьома бурштиновими рядками під нею: бракує заголовків безпеки, API відкритий\nдля будь-якого сайту, а ваш вихідний код опублікований. Або хтось технічний\nподивився за вас і сказав ті самі три речі більш стурбованим голосом. Для\nзастосунку, код якого ви ніколи не читали, останній рядок б’є найсильніше.",[10,14,15,16,20],{},"Ось те, у чому посібник за посібником про безпеку Base44 помиляється: ",[17,18,19],"strong",{},"майже\nкожен рядок у цьому звіті стосується Base44."," Три з чотирьох знахідок, що\nз’являються майже на кожному застосунку, задає платформа, для кожного\nзастосунку, який вона розміщує. А одна з цих трьох є реченням, яке наш власний\nскан формулює неправильно. Ця стаття існує тому, що ми повернулися й\nпрочитали, що саме він знайшов.",[10,22,23],{},"Уявіть свій застосунок як квартиру в будинку, що належить Base44. Скан читає\nбудинок з вулиці. Замок на вхідних дверях, вивіска над ними, правило про те,\nкому можна зазирати у вікна: це вирішив власник будинку, і кожна квартира це\nподіляє. Те, що ви принесли з собою, є коротшим списком, і решта цієї статті\nпроходить звіт рядок за рядком, щоб сказати, що кому належить.",[25,26,28],"h2",{"id":27},"що-скан-безпеки-base44-знаходить-майже-на-кожному-застосунку","Що скан безпеки Base44 знаходить майже на кожному застосунку",[10,30,31],{},"Три знахідки майже на кожному, четверта приблизно на половині, і всі чотири\nвирішує Base44.",[10,33,34,35,40],{},"У серпні 2026 року ми прогнали\n",[36,37,39],"a",{"href":38},"\u002Fresearch\u002Fvibe-coded-app-security-2026","ті самі дев’ять перевірок"," на 30 998\nживих вайб-кодених застосунках, 5 438 із яких опубліковано на Base44. Усім\n5 438 бракувало заголовків безпеки. 5 417 відповіли на запит із вигаданого\nсайту заголовком CORS із символом підстановки. 3 229 із них, 59 %, віддавали\nsource map. 2 705 мали адресу, названу у власному коді застосунку, яка\nвідповідала на запит без входу й повертала дані.",[42,43,44,69],"table",{},[45,46,47],"thead",{},[48,49,50,54,57,60,63,66],"tr",{},[51,52,53],"th",{},"Конструктор",[51,55,56],{},"Застосунки",[51,58,59],{},"Source map опубліковано",[51,61,62],{},"Знахідка CORS",[51,64,65],{},"Ключ у бандлі",[51,67,68],{},"Оцінка D або F",[70,71,72,93,113,133,153],"tbody",{},[48,73,74,78,81,84,87,90],{},[75,76,77],"td",{},"Base44",[75,79,80],{},"5 438",[75,82,83],{},"3 229 (59 %)",[75,85,86],{},"5 418 (99 %)",[75,88,89],{},"103 (2 %)",[75,91,92],{},"2",[48,94,95,98,101,104,107,110],{},[75,96,97],{},"Lovable",[75,99,100],{},"18 554",[75,102,103],{},"225 (1 %)",[75,105,106],{},"8 (менше 1 %)",[75,108,109],{},"822 (4 %)",[75,111,112],{},"407",[48,114,115,118,121,124,127,130],{},[75,116,117],{},"Replit",[75,119,120],{},"3 042",[75,122,123],{},"168 (6 %)",[75,125,126],{},"1 129 (37 %)",[75,128,129],{},"219 (7 %)",[75,131,132],{},"9",[48,134,135,138,141,144,147,150],{},[75,136,137],{},"Bolt",[75,139,140],{},"1 123",[75,142,143],{},"13 (1 %)",[75,145,146],{},"5 (менше 1 %)",[75,148,149],{},"75 (7 %)",[75,151,152],{},"15",[48,154,155,158,161,164,166,168],{},[75,156,157],{},"v0",[75,159,160],{},"1 790",[75,162,163],{},"0",[75,165,163],{},[75,167,163],{},[75,169,163],{},[10,171,172],{},"Кожен відсоток рахується від застосунків, на яких ця перевірка отримала\nвідповідь, тому бази трохи відрізняються від кількості застосунків. Перевірка,\nяка не змогла дістатися застосунку, залишає його осторонь. Він ніколи не\nрахується як чистий.",[10,174,175],{},"Прочитайте рядок Base44 проти рядка Lovable. На Lovable перші дві знахідки\nмайже ніколи не з’являються, бо хостинг Lovable задає обидві навпаки. На\nBase44 вони з’являються майже щоразу. Настільки однорідний стовпець на тисячах\nзастосунків, чиї власники ніколи не спілкувалися між собою, саме так виглядає\nналаштування платформи ззовні. Ніхто не обирав його у власному застосунку.",[10,177,178],{},"Останні два стовпці вирішуються всередині кожного застосунку, і вони\nрозповідають другу половину. Ключ у стиснутому коді трапився на 2 %\nзастосунків Base44 проти 4 % застосунків Lovable, а 2 застосунки Base44 з\n5 438 отримали D проти 407 застосунків Lovable з 18 554. Обидва ці застосунки\nBase44 є в останньому розділі.",[25,180,182],{"id":181},"знахідка-source-map-на-застосунку-base44-є-бейджем","Знахідка source map на застосунку Base44 є бейджем",[10,184,185],{},"Кожен source map, що відповідав на застосунках Base44, які ми відкрили\nповторно, належав скрипту бейджа Base44. Жоден із них не містив коду власника.",[10,187,188,191,192,196],{},[17,189,190],{},"Source map"," є файлом, який інструмент збірки записує поруч зі стиснутим\nJavaScript, що його віддає ваш сайт. Він містить оригінальні файли, їхні назви\nі кожен коментар, щоб помилка могла вказати на рядок, який ви написали, а не\nна символ 48 000 одного величезного рядка. Коли map опублікований, будь-хто,\nхто натисне F12, читає проєкт таким, яким він виглядав у редакторі, і\n",[36,193,195],{"href":194},"\u002Fblog\u002Fsource-maps-exposed-in-production","наша попередня стаття"," пояснює,\nчого це коштує на застосунку, де map ваш.",[10,198,199,200,204],{},"На Base44 map належить комусь іншому. 16 вересня 2026 року ми повернулися до\n30 застосунків, які наш серпневий скан позначив, і прочитали, що містив кожен\nmap. На 27 із них єдиним map, що відповідав, був ",[201,202,203],"code",{},"\u002Fstatic\u002Fjs\u002Fbadge.js.map",",\nmap маленького скрипта, який малює бейдж Base44 на сторінці, і розкриває він\nкод Base44 для цього бейджа. На решті 3 жоден map не відповів. На жодному з 30\nmap не покривав файли власника. Ці файли пішли стиснутими й без map на кожному\nзастосунку, який ми відкрили, як перший файл, що його завантажує сторінка, так\nі кожен шматок, який вона завантажує після нього.",[206,207],"diagram",{"alt":208,"caption":209,"src":210},"Дві панелі. Ліворуч, під логотипом Base44, кожен файл скрипта застосунку має пунктирне кільце там, де був би map, і лише скрипт бейджа має map, який веде до маленького логотипа Base44. Праворуч, під логотипом Lovable, головний скрипт застосунку має map, і цей map розкривається в теку з читабельними файлами.","На застосунку Base44 єдиний map, що відповідає, належить скрипту бейджа, і він містить код Base44. На застосунку Lovable map є власними файлами власника.","\u002Fblog\u002Fbase44-source-maps\u002Fwhose-map-answers-1600x720.png",[10,212,213],{},"Отже, ці 59 % рахують щось інше, ніж опублікований код. Із 30 позначених\nзастосунків 27 із 28, що відповідали, досі несуть скрипт бейджа на своїй\nсторінці, а з 30 застосунків, які ніколи не позначалися, 29 його не мають.\nЧисло, яке читається як «три з п’яти застосунків Base44 публікують свій код»,\nближче до «три з п’яти застосунків Base44 показують бейдж».",[10,215,216],{},"Залишається рядок у нашому власному звіті, за який треба відповісти. Він\nкаже «Ваш вихідний код опублікований», і на застосунку Base44 це правда про\nодин файл і неправда про ваш застосунок. Перевірка зробила те, для чого її\nзбудували: перейти за адресою внизу скрипта й порахувати map, який відповідає.\nТут скрипт належить власникові будинку. На Lovable, Replit і Bolt той самий\nрядок означає те, що каже. З 11 позначених застосунків цих конструкторів, які\nми відкрили повторно, 9 віддавали map із власними сторінками й компонентами\nвласника, а на інших 2 жоден map більше не відповідав.",[10,218,219],{},"Для вас це означає, що нічого вашого в цьому map немає. Перевірка, яка варта\nуваги, інша: чи лежить щось, що ви вставили в застосунок, у стиснутому файлі,\nякий кожен відвідувач і так отримує. Про це нижче.",[10,221,222,223,227],{},"Наш безкоштовний скан читає ваш живий застосунок на Base44 ззовні, усі\nдев’ять перевірок, приблизно за 20 секунд і без облікового запису, і пише\n«Не вдалося перевірити» для всього, на що не зміг відповісти, замість\nгалочки: ",[36,224,226],{"href":225},"\u002Fsecurity-scanner","проскануйте свій застосунок",".",[25,229,231],{"id":230},"символ-підстановки-cors-його-задає-base44-і-нічого-приватного-за-ним-не-відповідає","Символ підстановки CORS: його задає Base44, і нічого приватного за ним не відповідає",[10,233,234],{},"Ви не можете його змінити, і на застосунках Base44, які ми розглянули, за ним\nнемає приватних даних.",[10,236,237,238,241],{},"Знахідка є одним рядком у відповідях вашого сервера,\n",[201,239,240],{},"Access-Control-Allow-Origin: *",", який каже браузеру відвідувача, що сторінка\nз будь-якого іншого сайту може прочитати саме цю відповідь. Документація\nBase44 пояснює, звідки він береться (прочитано 16 вересня 2026 року): «Per-app\nCORS configuration is not currently available. Base44 manages CORS at the\nplatform level.» Його надсилає кожен застосунок на платформі, і саме так 5 417\nзастосунків із 5 419 опинилися з однією й тією самою знахідкою.",[10,243,244,245,249],{},"Чи має символ підстановки значення, залежить від того, що відповідає за ним, і\n",[36,246,248],{"href":247},"\u002Fblog\u002Fcors-wildcard-security-risk","довша стаття"," пояснює чому. Коротко:\nзаголовок приходить після того, як відповідь уже надіслано, і читає його лише\nбраузер, тож звуження заголовка зупинило б сторінки інших сайтів від читання\nвашого застосунку, і більше нікого. За ним на застосунку Base44 стоїть сам\nзастосунок: сторінка, стиснутий код, бейдж, і все це кожен відвідувач і так\nзавантажує.",[10,251,252,253,256],{},"Четверта знахідка є тим місцем, де символ підстановки мав би значення. На\n2 705 застосунках Base44, приблизно половині, адреса, названа в коді\nзастосунку, відповідала на запит без входу й повертала дані. 16 вересня ми\nвідкрили повторно 12 із них. На шести вже нічого не відповідало. На інших\nшести адреса, що відповідала, щоразу була тією самою, ",[201,254,255],{},"\u002Fapi\u002Fconsent\u002Fconfig",", і\nповертає вона налаштування згоди на cookie цього застосунку: чи ввімкнений\nбанер згоди, які регіональні правила застосовуються, скільки місяців\nзапам’ятовується відповідь. Це конфігурація. Нічиїх рядків у ній немає.",[10,258,259,260,264],{},"Ваші дані на Base44 цим шляхом не ходять. Ваш застосунок звертається до\nбекенду Base44, бекенд застосовує правила доступу, які ви задали на кожній\nтаблиці, і відповідь повертається через ті самі двері. Скан ззовні взагалі не\nможе побачити ці правила, і саме тому ",[36,261,263],{"href":262},"\u002Fis-your-base44-app-safe","посібник із Base44","\nвитрачає час на те, до чого може дістатися сторонній, а ваші правила залишає\nвам.",[25,266,268],{"id":267},"що-на-застосунку-base44-належить-вам","Що на застосунку Base44 належить вам",[10,270,271],{},"Короткий список, і обидві оцінки D у вибірці прийшли з нього.",[10,273,274,277,278,282,283,287],{},[17,275,276],{},"Ключ, який ви вставили."," 103 із 5 438 застосунків Base44, 2 %, віддавали\nщось схоже на ключ у коді, який завантажує кожен відвідувач. 95 із них були\nAPI-ключами Google, яким\n",[36,279,281],{"href":280},"\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend","зазвичай потрібне обмеження в Google Cloud",",\nа не ротація. Один був секретним ключем Stripe, і той застосунок отримав D.\nBase44 тримає власні облікові дані на своєму сервері, тож ключ у вашому бандлі\nє тим, який ви або конструктор додали заради якоїсь функції: карти, тега\nаналітики, платіжної форми.\n",[36,284,286],{"href":285},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","Якого він типу",", читається за\nхвилину, а секретний ротують там, де його видали, перш ніж прибрати з коду.",[10,289,290,293],{},[17,291,292],{},"Правила доступу до ваших таблиць."," Base44 називає їх data access rules, і\nвони вирішують, хто може читати й редагувати кожен тип запису. Ніхто ззовні не\nможе їх перевірити, і ми теж, і це єдине місце, де скан ззовні мусить залишити\nпорожнє поле. Власний скан безпеки Base44 їх читає, і його документація каже,\nщо скан доступний на кожному тарифі, включно з безкоштовним.",[10,295,296,299,300,303],{},[17,297,298],{},"Усе, що ви підключили самі."," Інша оцінка D у вибірці належала застосунку\nBase44 із власним проєктом Supabase і таблицею в ньому з назвою на кшталт\nперсональних даних, яка відповідала на запит без входу. Підключіть власну базу\nданих, і звичні ",[36,301,302],{"href":262},"правила для рядків"," діють у повному\nобсязі, бо цей проєкт відповідає інтернету напряму.",[206,305],{"alt":306,"caption":307,"src":308},"Звіт скану, намальований як шість рядків. Перші чотири, заголовки, глобус для CORS, скрипт зі своїм map і пакет даних, намальовані блідо, і кожен закінчується маленьким логотипом Base44. Останні два, ключ і таблиця бази даних, намальовані в акцентному кольорі, і кожен закінчується людиною.","Шість рядків, які скан може надрукувати на застосунку Base44. Перші чотири задає платформа для кожного застосунку на ній. Останні два є тими, що їх може змінити власник, і обидві оцінки D у вибірці прийшли саме з них.","\u002Fblog\u002Fbase44-source-maps\u002Fwho-owns-each-line-1600x760.png",[25,310,312],{"id":311},"що-ви-можете-змінити-зсередини-base44","Що ви можете змінити зсередини Base44",[10,314,315],{},"Два заголовки, правила ваших таблиць і ваші ключі. Решту задано для кожного\nзастосунку на платформі.",[10,317,318,319,322,323,326,327,330,331,334,335,338,339,342],{},"Документація Base44 перелічує, що ви можете перемкнути (прочитано 16 вересня\n2026 року). На панелі вашого застосунку, у розділі Security, а далі значок\nналаштувань, ви можете ввімкнути два заголовки безпеки. ",[17,320,321],{},"Prevent Embedding","\nзадає ",[201,324,325],{},"X-Frame-Options",", який не дає показувати ваш застосунок усередині\nсторінки іншого сайту. ",[17,328,329],{},"Restrict Browser Features"," задає\n",[201,332,333],{},"Permissions-Policy",", який обмежує, що ваш застосунок може просити в браузера,\nзокрема камеру й геолокацію. Якщо люди входять у ваш застосунок і можуть\nодним кліком зробити щось із наслідками, увімкніть перший. Та сама сторінка\nкаже, що ",[201,336,337],{},"Content-Security-Policy"," і ",[201,340,341],{},"Strict-Transport-Security"," «are not\nconfigurable at the individual app level». Це більша частина знахідки про\nзаголовки, і вона поза вашими руками.",[10,344,345],{},"Власний скан Base44 покриває внутрішнє: проблеми з правами доступу до даних,\nрозкриті секрети, бекенд-функції без перевірки входу, залежності і, від тарифу\nBuilder і вище, вразливості в коді. Його документація не згадує ні source map,\nні заголовок CORS, і це чесно, бо обидва належать платформі. Скан ззовні\nпокриває те, що віддається браузеру відвідувача, і на застосунку Base44 саме\nтам список найкоротший.",[42,347,348,361],{},[45,349,350],{},[48,351,352,355,358],{},[51,353,354],{},"Що каже звіт",[51,356,357],{},"Хто це задає",[51,359,360],{},"Що робити",[70,362,363,374,384,395,408,418],{},[48,364,365,368,371],{},[75,366,367],{},"Бракує заголовків безпеки",[75,369,370],{},"Base44, із двома перемикачами для вас",[75,372,373],{},"Увімкніть Prevent Embedding, якщо люди входять. Решту залиште.",[48,375,376,379,381],{},[75,377,378],{},"API відкритий для будь-якого сайту",[75,380,77],{},[75,382,383],{},"Нічого. Натомість подивіться, що відповідає за ним.",[48,385,386,389,392],{},[75,387,388],{},"Вихідний код опублікований",[75,390,391],{},"Скрипт бейджа Base44",[75,393,394],{},"Нічого. Map містить код Base44 для бейджа.",[48,396,397,400,405],{},[75,398,399],{},"Адреса відповідає без входу",[75,401,402,403],{},"Base44, за адресою ",[201,404,255],{},[75,406,407],{},"Прочитайте, що вона повертає. Налаштування згоди публічні за задумом.",[48,409,410,412,415],{},[75,411,65],{},[75,413,414],{},"Ви",[75,416,417],{},"Ротуйте секретний ключ у його джерелі. Обмежте ключ Google.",[48,419,420,423,426],{},[75,421,422],{},"Читабельна таблиця",[75,424,425],{},"Ви, якщо підключили власну базу даних",[75,427,428],{},"Row Level Security на кожній таблиці, що містить людей.",[25,430,432],{"id":431},"що-робити-просто-зараз","Що робити просто зараз",[434,435,436],"key-takeaways",{},[437,438,439,443,450,453,459,462],"ul",{},[440,441,442],"li",{},"Читайте три рядки платформи у своєму звіті як рядки Base44, а потім читайте решту.",[440,444,445,446,449],{},"Натисніть F12 на своєму живому застосунку й відкрийте вкладку ",[17,447,448],{},"Sources",". Немає теки з вашими власними файлами, отже, немає map вашого коду, хоч би що казав звіт.",[440,451,452],{},"Знайдіть кожен ключ у застосунку й прочитайте його префікс. Секретний ротують там, де його видали, а потім прибирають із коду, саме в такому порядку.",[440,454,455,456,458],{},"Увімкніть ",[17,457,321],{}," у розділі Security, якщо ваші користувачі входять.",[440,460,461],{},"Відкрийте Data, оберіть таблицю, далі Permissions, і прочитайте правило на кожній таблиці, що містить людей.",[440,463,464],{},"Якщо ви підключили власний проєкт Supabase, увімкніть Row Level Security на кожній його таблиці й перевірте, що воно справді фільтрує.",[10,466,467],{},"Публікація на Base44 є одним кліком у верхній панелі, і ніщо між цим кліком\nта інтернетом не перечитує застосунок у пошуках ключа, вставленого, щоб\nзапрацювала якась функція. Скан, який ви запускали минулого місяця, описує\nзастосунок минулого місяця.",[10,469,470,474],{},[36,471,473],{"href":472},"\u002Fpricing","Reeve Monitor"," створений саме для цього. Він щогодини повторює всі\nдев’ять перевірок на щонайбільше трьох застосунках, стежить за доступністю\nкожні 60 секунд, повідомляє вас, коли результат змінюється, замість чекати,\nпоки ви подивитеся, і надсилає щомісячний звіт. Коштує $12 на місяць за\nпрайсом, із сімома безкоштовними днями до першого списання; сторінка цін іноді\nнижча за цифру тут і ніколи не вища. Monitor стежить і більше нічого, і для\nзастосунку на Base44 це та половина, яка підходить: Care, наш тариф резервного\nкопіювання, робить копії лише проєктів Supabase, а застосунок на Base44\nтримає свої дані всередині Base44, якщо ви не підключили власний проєкт.",[10,476,477,478,481,482,486],{},"Посібник простою мовою для цієї платформи є тут:\n",[36,479,480],{"href":262},"Чи безпечний ваш застосунок на Base44?",", а\n",[36,483,485],{"href":484},"\u002Fchecklist","10-хвилинний чекліст безпеки"," охоплює те, що варто перевірити на\nбудь-якому щойно запущеному застосунку, хоч би що його збудувало.",{"title":488,"searchDepth":489,"depth":489,"links":490},"",3,[491,493,494,495,496,497],{"id":27,"depth":492,"text":28},2,{"id":181,"depth":492,"text":182},{"id":230,"depth":492,"text":231},{"id":267,"depth":492,"text":268},{"id":311,"depth":492,"text":312},{"id":431,"depth":492,"text":432},"Основи безпеки","\u002Fblog\u002Fbase44-source-maps\u002Fcover-1200x630.png","Застосунок на Base44 з бейджем платформи в кутку, прочитаний ззовні у звіт із трьома блідими рядками й одним в акцентному кольорі.","Безпека Base44 на 5 438 просканованих застосунках: три знахідки майже на кожному належать платформі, source map є бейджем Base44, а ваша частина коротка.",false,"md",[505,508,511,514,517],{"q":506,"a":507},"Мій скан каже, що мій застосунок на Base44 публікує свій вихідний код. Це правда?","На застосунках Base44, які ми перевірили повторно у вересні 2026 року, ні. Єдиний source map, що відповідав, належав скрипту бейджа Base44 і містить код Base44 для цього бейджа. Ваші власні файли пішли стиснутими й без map на кожному застосунку, який ми відкрили. Той самий рядок на застосунку з іншого конструктора зазвичай означає саме те, що каже, і там його варто прочитати.",{"q":509,"a":510},"Чи можу я вимкнути символ підстановки CORS на застосунку Base44?","Ні. Документація Base44 каже, що налаштування CORS для окремого застосунку недоступне і що ним керує платформа. Ви вирішуєте лише те, що адреси вашого застосунку віддають на запит без входу, а саме там цей заголовок і мав би значення. На застосунках Base44, які ми відкрили повторно, єдина адреса, що відповідала без входу, повертала налаштування згоди на cookie.",{"q":512,"a":513},"Чи Base44 менш безпечний за Lovable?","Скан не може ранжувати конструктори, а ці два мають різну форму. Застосунок на Base44 видає більше знахідок, і майже всі вони є налаштуваннями платформи, які не розкривають нічого вашого. Застосунок на Lovable говорить зі своєю базою Supabase напряму, тож налаштування, через яке витікає найбільше даних, таблиця без правил для рядків, доступне тому, хто будує на Lovable, і недоступне тому, хто будує на Base44. Дві оцінки D серед 5 438 застосунків Base44 проти 407 серед 18 554 застосунків Lovable і є цією різницею в цифрах. Про ваш застосунок це не каже нічого, доки ви його не проскануєте.",{"q":515,"a":516},"Що я можу змінити зсередини Base44?","Два заголовки безпеки (Prevent Embedding і Restrict Browser Features, у розділі Security на панелі вашого застосунку), правила доступу до кожної таблиці, які бекенд-функції вимагають користувача з входом, і які ключі ви вставляєте в застосунок. CORS, Content-Security-Policy і Strict-Transport-Security платформа задає для кожного застосунку, і документація Base44 так і каже.",{"q":518,"a":519},"Чи розкриває публічний source map мої API-ключі?","Map розкриває код, а ключ, що лежить у коді, уже був у стиснутому файлі, який завантажує кожен відвідувач. На застосунку Base44 єдиний map, який ми знайшли, належить бейджу, тож справжнє питання в тому, чи є в вашому бандлі взагалі якийсь ключ. Наш скан читає бандл заради цього окремо. На застосунках Base44 ключі, які він знаходить, майже завжди є API-ключами Google, яким зазвичай потрібне обмеження в Google Cloud, а не ротація.","\u002Fblog\u002Fbase44-source-maps\u002Fcard-800x500.png",[522,523,524,525,526,527,528],"безпека base44","чи безпечний base44","base44 source maps","безпека застосунку base44","base44 cors","base44 чи lovable безпека","base44 security",{},true,"\u002Fblog\u002Fbase44-source-maps","2026-09-17",{"title":5,"description":501},"blog\u002Fbase44-source-maps",[536,537,538],"Безпеку Base44 здебільшого вирішує платформа. Скан застосунку на Base44 видає ті самі три знахідки майже на кожному: відсутні заголовки, заголовок CORS із символом підстановки та опублікований source map.","16 вересня 2026 року ми повернулися й прочитали, що міститься в тих source map. Кожен, що відповідав, належав скрипту бейджа Base44. Код власника пішов без map на кожному застосунку, який ми відкрили.","Ваша частина коротка: будь-який ключ, вставлений у застосунок (знайдений на 2 % застосунків Base44), правила доступу до ваших таблиць і все, що ви підключили самі. Обидві оцінки D серед 5 438 застосунків прийшли саме з цього списку.","tuEdNz3iMG-NxiouQo2V1OPxl6aRPqzsyKciAFUyUCY",[541,548,554,560,566,572,578,579,585,591,597,603,609,615,621,627,633,639,645,651,657,663,669,675,681,687,693,699,705,710,716,722,728,733,739,745,749,755,761,767,772,778],{"path":542,"title":543,"description":544,"published":545,"category":546,"image":547,"draft":502},"\u002Fblog\u002Fsupabase-backup-auth-users","Чому у вашому дампі Supabase немає користувачів","Запустіть supabase db dump окремо і отримаєте форму вашої бази та жодного її рядка, без схеми auth, у якій живуть ваші користувачі.","2026-09-23","Backups","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":549,"title":550,"description":551,"published":552,"category":498,"image":553,"draft":502},"\u002Fblog\u002Fdomain-and-certificate-expiry","Домен закінчився, сайт лежить: що буде далі","Ваш домен закінчився і сайт лежить. Ось який годинник уже пішов, чому прострочений сертифікат це менша з двох бід, і як перевірити обидва.","2026-09-22","\u002Fblog\u002Fdomain-and-certificate-expiry\u002Fcard-800x500.png",{"path":555,"title":556,"description":557,"published":558,"category":498,"image":559,"draft":502},"\u002Fblog\u002Fis-lovable-safe","Чи безпечний Lovable? Що показали 18 554 застосунки Lovable","Чи безпечний Lovable? Ми прогнали 18 554 живі застосунки Lovable через дев’ять перевірок. Платформа виявилася найчистішою з п’яти. Знахідки були в застосунках.","2026-09-21","\u002Fblog\u002Fis-lovable-safe\u002Fcard-800x500.png",{"path":561,"title":562,"description":563,"published":564,"category":498,"image":565,"draft":502},"\u002Fblog\u002Fvibe-coded-app-security-checklist","Чек-лист безпеки для vibe coding, у девʼяти перевірках","Чек-лист безпеки для vibe coding із девʼяти пунктів, кожен з яких будь-хто може перевірити у вашому живому застосунку ззовні, і кожен має тест на один рядок.","2026-09-20","\u002Fblog\u002Fvibe-coded-app-security-checklist\u002Fcard-800x500.png",{"path":567,"title":568,"description":569,"published":570,"category":498,"image":571,"draft":502},"\u002Fblog\u002Fstripe-secret-key-in-frontend","Секретний ключ Stripe у фронтенді може рухати гроші","Секретний ключ Stripe, відкритий у вашому фронтенді, може повертати кошти, списувати й читати кожну картку клієнта. А ключ pk_live_ там і має бути.","2026-09-19","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Fcard-800x500.png",{"path":573,"title":574,"description":575,"published":576,"category":498,"image":577,"draft":502},"\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":531,"title":5,"description":501,"published":532,"category":498,"image":520,"draft":502},{"path":580,"title":581,"description":582,"published":583,"category":498,"image":584,"draft":502},"\u002Fblog\u002Fis-cursor-ai-safe","Чи безпечний Cursor AI? Редактор, код і опублікований застосунок","Чи безпечний Cursor AI? Три запитання в одному пошуку: що Cursor зберігає, у чому помиляється його код і чи відкритий застосунок, який ви опублікували.","2026-09-16","\u002Fblog\u002Fis-cursor-ai-safe\u002Fcard-800x500.png",{"path":586,"title":587,"description":588,"published":589,"category":498,"image":590,"draft":502},"\u002Fblog\u002Fis-replit-safe","Чи безпечний Replit? Що ми знайшли в 3 042 живих застосунках Replit","Чи безпечний Replit? Ми прогнали 3 042 живі застосунки Replit через дев’ять зовнішніх перевірок. Знахідки були в опублікованому застосунку, а не в хостингу.","2026-09-15","\u002Fblog\u002Fis-replit-safe\u002Fcard-800x500.png",{"path":592,"title":593,"description":594,"published":595,"category":546,"image":596,"draft":502},"\u002Fblog\u002Fsupabase-storage-backup","Supabase storage backup: у копії бази даних немає жодного файлу","Supabase storage backup це окрема робота. Копії бази даних зберігають список ваших файлів і жодного з них, тож після відновлення кожне завантаження зламане.","2026-09-14","\u002Fblog\u002Fsupabase-storage-backup\u002Fcard-800x500.png",{"path":598,"title":599,"description":600,"published":601,"category":546,"image":602,"draft":502},"\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":604,"title":605,"description":606,"published":607,"category":546,"image":608,"draft":502},"\u002Fblog\u002Fsupabase-project-paused-recover","Проєкт Supabase на паузі? Ваші дані нікуди не зникли","Supabase поставив ваш проєкт на паузу після тижня без активності. Нічого не видалено, кнопка Restore стоїть поруч із назвою, і у вас є рік, щоб натиснути.","2026-09-12","\u002Fblog\u002Fsupabase-project-paused-recover\u002Fcard-800x500.png",{"path":610,"title":611,"description":612,"published":613,"category":498,"image":614,"draft":502},"\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":616,"title":617,"description":618,"published":619,"category":498,"image":620,"draft":502},"\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":622,"title":623,"description":624,"published":625,"category":498,"image":626,"draft":502},"\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":628,"title":629,"description":630,"published":631,"category":498,"image":632,"draft":502},"\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":634,"title":635,"description":636,"published":637,"category":498,"image":638,"draft":502},"\u002Fblog\u002Fvibe-coding-security-scanners-compared","Сканери безпеки для vibe coding у порівнянні, наш теж","Найкращий сканер безпеки для vibe coding залежить від трьох питань, на які не відповідає жоден перелік функцій. Десять інструментів і ціни.","2026-09-07","\u002Fblog\u002Fvibe-coding-security-scanners-compared\u002Fcard-800x500.png",{"path":640,"title":641,"description":642,"published":643,"category":498,"image":644,"draft":502},"\u002Fblog\u002Fsupabase-security-checker","Supabase security checker: п’ять перевірок, які зробите самі","Supabase security checker читає ваш опублікований застосунок, а не налаштування проєкту. Ось п’ять перевірок і як виконати кожну самостійно.","2026-09-06","\u002Fblog\u002Fsupabase-security-checker\u002Fcard-800x500.png",{"path":646,"title":647,"description":648,"published":649,"category":498,"image":650,"draft":502},"\u002Fblog\u002Fvibe-coding-security-scanner","Сканер безпеки для vibe coding: чого не бачить скан URL","Сканер безпеки для vibe coding читає ваш робочий застосунок ззовні. Що це охоплює, чотири речі, яких він не бачить, і як читати результат.","2026-09-05","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fcard-800x500.png",{"path":652,"title":653,"description":654,"published":655,"category":498,"image":656,"draft":502},"\u002Fblog\u002Fmissing-security-headers","Відсутні заголовки безпеки: коли це справді важливо","Відсутні заголовки безпеки трапляються в наших звітах найчастіше. Від чого вони захищають і коли це найменш терміновий рядок вашого звіту.","2026-09-04","\u002Fblog\u002Fmissing-security-headers\u002Fcard-800x500.png",{"path":658,"title":659,"description":660,"published":661,"category":498,"image":662,"draft":502},"\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":664,"title":665,"description":666,"published":667,"category":498,"image":668,"draft":502},"\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":670,"title":671,"description":672,"published":673,"category":546,"image":674,"draft":502},"\u002Fblog\u002Fsupabase-backup-tools-compared","Інструменти резервного копіювання Supabase, і наш серед них","Чотири види інструментів резервного копіювання Supabase, що копіює кожен і коли безкоштовна GitHub Action виграє в будь-якої оплати, нашої теж.","2026-09-01","\u002Fblog\u002Fsupabase-backup-tools-compared\u002Fcard-800x500.png",{"path":676,"title":677,"description":678,"published":679,"category":498,"image":680,"draft":502},"\u002Fblog\u002Freplit-secrets-explained","Як користуватися секретами в Replit і що все одно публікується","Як користуватися секретами в Replit: додати, прочитати і усунути дві причини undefined. А ще ключі, які цей інструмент не здатен зберегти в таємниці.","2026-08-31","\u002Fblog\u002Freplit-secrets-explained\u002Fcard-800x500.png",{"path":682,"title":683,"description":684,"published":685,"category":546,"image":686,"draft":502},"\u002Fblog\u002Fback-up-supabase-free-tier","Резервні копії на безкоштовному тарифі Supabase без терміналу","На безкоштовному тарифі Supabase резервних копій немає: копію робите ви. Як зробити її з панелі та що втрачає шлях через CSV.","2026-08-30","\u002Fblog\u002Fback-up-supabase-free-tier\u002Fcard-800x500.png",{"path":688,"title":689,"description":690,"published":691,"category":498,"image":692,"draft":502},"\u002Fblog\u002Fis-supabase-secure","Чи безпечний Supabase? Так. Ваш проєкт це інше питання","Чи безпечний Supabase? Платформа проходить аудити, шифрує дані й тримає пентести. Їхня документація каже, де це закінчується і починаються ваші налаштування.","2026-08-29","\u002Fblog\u002Fis-supabase-secure\u002Fcard-800x500.png",{"path":694,"title":695,"description":696,"published":697,"category":498,"image":698,"draft":502},"\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":700,"title":701,"description":702,"published":703,"category":498,"image":704,"draft":502},"\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":247,"title":706,"description":707,"published":708,"category":498,"image":709,"draft":502},"Чи є вайлдкард CORS ризиком для безпеки? Майже ніколи.","Чи є вайлдкард CORS ризиком для безпеки? Зазвичай це типове налаштування вашого білдера, і воно не видає нічого, що ваш сервер і так віддавав кожному.","2026-08-26","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fcard-800x500.png",{"path":711,"title":712,"description":713,"published":714,"category":546,"image":715,"draft":502},"\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":717,"title":718,"description":719,"published":720,"category":546,"image":721,"draft":502},"\u002Fblog\u002Fhow-to-restore-a-supabase-backup","Як відновити резервну копію Supabase, і що ламається потім","Як відновити резервну копію Supabase з панелі або з файлу дампа, що саме замінює відновлення і чому ваш застосунок може лишитися зламаним після нього.","2026-08-24","\u002Fblog\u002Fhow-to-restore-a-supabase-backup\u002Fcard-800x500.png",{"path":723,"title":724,"description":725,"published":726,"category":498,"image":727,"draft":502},"\u002Fblog\u002Fsupabase-storage-bucket-public","Ваш бакет Supabase Storage публічний. Чи це проблема?","Публічний бакет Supabase Storage означає, що той, хто має URL файлу, може його відкрити. Він не означає, що хтось може переглянути список вмісту.","2026-08-23","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcard-800x500.png",{"path":280,"title":729,"description":730,"published":731,"category":498,"image":732,"draft":502},"Чи є проблемою ключ API Google у вашому браузері?","Ключ API Google у відкритому коді сторінки наш сканер знаходить найчастіше, і зазвичай усе гаразд. Вирішує це одне безкоштовне налаштування.","2026-08-22","\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":734,"title":735,"description":736,"published":737,"category":546,"image":738,"draft":502},"\u002Fblog\u002Fai-agent-deleted-my-database","ШІ-агент видалив мої дані в Supabase. Що можна відновити?","ШІ-агент видалив дані з вашої бази. Те, що ви зможете відновити, вирішилося раніше, а наступні хвилини вирішують, скільки з цього вціліє.","2026-08-21","\u002Fblog\u002Fai-agent-deleted-my-database\u002Fcard-800x500.png",{"path":740,"title":741,"description":742,"published":743,"category":498,"image":744,"draft":502},"\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":194,"title":746,"description":747,"published":743,"category":498,"image":748,"draft":502},"Відкриті source maps: ваш застосунок публікує свій вихідний код","Відкрита source map дає будь-кому прочитати оригінальний код вашого застосунку, разом із коментарями. Перевірка за 30 секунд, і що важить насправді.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fcard-800x500.png",{"path":750,"title":751,"description":752,"published":753,"category":498,"image":754,"draft":502},"\u002Fblog\u002Fsupabase-new-api-keys","Нові API-ключі Supabase: який із них безпечний у застосунку?","Supabase замінив anon і service_role публічними та секретними ключами. Який із них має бути у вашому застосунку, а який не має бути ніколи?","2026-08-12","\u002Fblog\u002Fsupabase-new-api-keys\u002Fcard-800x500.png",{"path":756,"title":757,"description":758,"published":759,"category":546,"image":760,"draft":502},"\u002Fblog\u002Fdoes-supabase-back-up-my-database","Чи робить Supabase резервні копії моєї бази? Залежить від тарифу.","Чи робить Supabase резервні копії вашої бази даних? На платних тарифах щодня, на безкоштовному жодної. Як дізнатися, що у вас насправді є.","2026-08-11","\u002Fblog\u002Fdoes-supabase-back-up-my-database\u002Fcard-800x500.png",{"path":762,"title":763,"description":764,"published":765,"category":498,"image":766,"draft":502},"\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":768,"title":769,"description":770,"published":765,"category":546,"image":771,"draft":502},"\u002Fblog\u002Fversion-history-is-not-a-backup","Історія версій не є резервною копією. Вона не поверне таблицю.","Lovable і Bolt ведуть історію версій вашого коду. Ваша база даних працює як окремий сервіс, тож відкат назад не поверне ваші дані.","\u002Fblog\u002Fversion-history-is-not-a-backup\u002Fcard-800x500.png",{"path":773,"title":774,"description":775,"published":776,"category":546,"image":777,"draft":502},"\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":285,"title":779,"description":780,"published":776,"category":498,"image":781,"draft":502},"Які API-ключі безпечні у браузері, а які ні","Ваш ключ anon у Supabase створений, щоб бути публічним. Ключ service_role для цього не створений, і він ігнорує всі правила, які ви задали. Як їх розрізнити.","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend\u002Fcard-800x500.png",1790150956242]