[{"data":1,"prerenderedAt":305},["ShallowReactive",2],{"blog-uk-source-maps-exposed-in-production":3},{"id":4,"title":5,"body":6,"category":262,"cover":263,"coverAlt":263,"description":264,"draft":265,"extension":266,"faq":267,"image":283,"keywords":284,"meta":292,"navigation":293,"ogTitle":294,"path":295,"published":296,"seo":297,"stem":298,"tldr":299,"updated":296,"__hash__":304},"blog_uk\u002Fblog\u002Fsource-maps-exposed-in-production.md","Відкриті source maps: ваш застосунок публікує свій вихідний код",{"type":7,"value":8,"toc":251},"minimark",[9,13,16,21,24,27,30,44,48,51,54,65,71,74,78,81,107,110,118,122,125,128,136,139,143,146,149,154,161,165,168,171,181,196,203,207,235,243],[10,11,12],"p",{},"Ви просканували свій застосунок, і один рядок звіту каже: ваш вихідний код\nопублікований. Або хтось технічний натиснув F12 на вашому сайті й сказав, що\nваші source maps відкриті. У будь-якому разі це звучить погано в дуже\nособистий спосіб: те, що ви будували місяцями, схоже, лежить у всіх на виду,\nразом із коментарями.",[10,14,15],{},"Тривожне прочитання і знизування плечима помиляються обидва. Source map не є\nсекретом. Це карта (назва буквальна) до місця, де лежали б ваші секрети, якщо\nякийсь із них колись потрапив у код. Чи важить ваша, залежить від того, що\nвсередині, а перевірити це можна приблизно за 30 секунд.",[17,18,20],"h2",{"id":19},"чи-погано-що-ваші-source-maps-відкриті","Чи погано, що ваші source maps відкриті?",[10,22,23],{},"Це варто виправити цього тижня. І це майже ніколи не привід панікувати цієї\nночі.",[10,25,26],{},"Відкрита source map показує код, а ваш застосунок і так віддає\nсвій код кожному відвідувачу: стиснутий у нечитабельний блок, але присутній,\nбо так працює вебсайт. Терплячий сторонній із правильними інструментами міг би\nвідновити приблизну версію і з самого лише стиснутого файлу. Карта прибирає\nвимогу терплячості: з нею будь-хто, хто натисне F12, читає ваш проєкт таким\nохайним, яким він виглядає у вашому редакторі.",[10,28,29],{},"Наш сканер класифікує опубліковану source map як середній рівень, тобто середину\nшкали серйозності, і це місце вибране свідомо. Сам по собі читабельний код означає\nвтрату приватності: хтось може вивчити, як працює ваш застосунок, прочитати\nнапівготові функції, позичити ваші ідеї. Неприємно, а для застосунку, чия\nцінність у дотепному промпті чи незвичному сценарії, це справжня бізнесова\nпроблема. Але не відкрита каса.",[10,31,32,33,38,39,43],{},"Вага змінюється в той день, коли у вашому коді з'являється щось, що ніколи не\nмало бути кодом. Ключ, який працює як частина застосунку, потрапляє і в\nстиснутий файл. Карта робить його легшим для пошуку, але опублікований він\nбув і без неї, і це\n",[34,35,37],"a",{"href":36},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","окрема, більша знахідка",".\nКоментарі працюють інакше. Стискання видаляє їх із того, що віддається, тож\nкарта лишається єдиним публічним місцем, де коментар існує. Пароль у закоментованому рядку,\nнотатка ",[40,41,42],"code",{},"remove before launch"," над тим, що так і не прибрали, внутрішня\nадреса, записана поруч із функцією, яка її викликає – до всього цього\nсторонній не дотягнеться ніде, крім карти.",[17,45,47],{"id":46},"що-таке-source-map-насправді","Що таке source map насправді",[10,49,50],{},"Це переклад між кодом, який віддає ваш сайт, і кодом, який написали ви.",[10,52,53],{},"Коли застосунок публікується, крок збірки стискає код: усі файли зліплені\nдокупи, кожна назва скорочена до однієї-двох літер, кожен коментар прибраний,\nусе це в одному велетенському рядку. Браузери виконують це без нарікань.\nПрочитати його не може ніхто, навіть інструменти, які його збудували, і це\nстає проблемою тієї миті, коли щось падає, а помилка вказує на рядок 1, символ\n48 120 файлу, якого жодна людина ніколи не бачила.",[10,55,56,57,60,61,64],{},"Тому інструменти збірки пишуть другий файл, source map. Він лежить поруч зі\nстиснутим (",[40,58,59],{},"app.js"," отримує ",[40,62,63],{},"app.js.map",") і тримає все, що стискання\nвикинуло: ваші оригінальні файли, їхні назви, структуру тек і кожен коментар.\nОстанній рядок стиснутого файлу несе адресу карти, і браузер довантажує карту,\nщойно відкриваються його інструменти розробника. Оце й увесь задум. Вона\nіснує, щоб помилка могла вказати на код, який ви справді написали.",[66,67],"diagram",{"alt":68,"caption":69,"src":70},"Ліворуч стоїть стиснутий файл бандла, намальований як стіна з нечитабельних рисок, а під ним його файл source map. Стрілка веде праворуч, до того самого застосунку у вигляді читабельного проєкту: тека src, файли компонентів і рядки коду, серед яких два рядки коментарів підсвічені бурштиновим.","Саме стиснутий файл виконують ваші відвідувачі. Карта перетворює його назад на проєкт, який ви написали. А коментарі, вирізані з бандла, існують лише на читабельному боці.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fwhat-the-map-reveals-1600x720.png",[10,72,73],{},"Із цього задуму випливають дві речі. Ваші відвідувачі ніколи не завантажують\nкарту (браузер просить її лише тоді, коли відкриті інструменти розробника),\nтож опублікована карта нічого не коштує, нічого не змінює на екрані й ніколи\nне дає про себе знати. І будь-що, що може відкрити ваш сайт, може забрати\nкарту, бо адреса записана на сторінці, а входу перед нею немає. Чи лежить там\nфайл, вирішує налаштування збірки, і ззовні «увімкнено» виглядає точнісінько як\n«вимкнено», доки хтось не піде подивитися.",[17,75,77],{"id":76},"як-перевірити-свій-застосунок-за-30-секунд","Як перевірити свій застосунок за 30 секунд",[10,79,80],{},"На живому застосунку, тобто на опублікованій адресі, яку відвідують ваші\nкористувачі, а не в передперегляді всередині білдера:",[82,83,84,88,96],"ol",{},[85,86,87],"li",{},"Відкрийте застосунок у Chrome, Edge чи Firefox і натисніть F12. Це відкриє\nінструменти розробника браузера, ту саму панель, якою скористався б\nсторонній.",[85,89,90,91,95],{},"Клацніть вкладку ",[92,93,94],"strong",{},"Sources"," угорі панелі.",[85,97,98,99,102,103,106],{},"Прочитайте дерево файлів ліворуч. Стиснутий код виглядає як один-два файли\nз назвами на кшталт ",[40,100,101],{},"index-4f81ab2c.js",". Source maps виглядають як ваш\nпроєкт: тека з назвою ",[40,104,105],{},"src",", файли з іменами ваших сторінок і компонентів,\nа всередині лежить код, який справді можна читати.",[10,108,109],{},"Якщо ви можете відкрити там файл і побачити власні коментарі, ваші source\nmaps опубліковані. Браузер малює це дерево лише тому, що завантажив карту з\nвашого живого сайту, точно так само, як зробив би браузер будь-кого іншого.",[10,111,112,113,117],{},"Якщо не хочеться копирсатися в панелях, наш безплатний скан читає ваш живий\nсайт ззовні й звітує про цю перевірку разом із вісьмома іншими:\n",[34,114,116],{"href":115},"\u002F#scan","сканувати застосунок",". Це триває близько 20 секунд і не потребує\nоблікового запису.",[17,119,121],{"id":120},"що-сторонній-може-побачити-а-чого-ні","Що сторонній може побачити, а чого ні",[10,123,124],{},"Усе, що ви написали в самому застосунку, і нічого поза ним.",[10,126,127],{},"Опубліковані source maps показують ваш фронтенд: сторінки, компоненти, логіку,\nщо працює в браузері, назви маршрутів, які викликає застосунок, будь-який\nпромпт, вписаний у застосунок, і кожен коментар.",[10,129,130,131,135],{},"До вашого сервера вони не дістають. Код, що працює в edge-функції чи бекенді,\nзалишається там, де є. Вашу базу даних вони теж не відчиняють. Чи може\nсторонній читати ваші таблиці, вирішують правила на кожній таблиці, а не\nвидимість вашого коду, і\n",[34,132,134],{"href":133},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","це питання ми виміряли окремо","\nна тих самих застосунках.",[10,137,138],{},"На практиці шкода від опублікованої карти приходить як тихе читання, а не як\nефектний злам: хтось вивчає вашу логіку оплати в пошуках способу її обійти або\nзнаходить адмінський маршрут, на який ніхто ніколи не посилався, і пробує\nйого. Кожне з цього стає проблемою лише тоді, коли знайдене не було захищене.\nКарта служить путівником для стороннього; вона сама не є відчиненими дверима.",[17,140,142],{"id":141},"як-часто-трапляються-опубліковані-source-maps","Як часто трапляються опубліковані source maps",[10,144,145],{},"У серпні 2026 року ми просканували 30 998 живих застосунків, опублікованих із\nLovable, Base44, Replit, v0 і Bolt. Кожен восьмий (13 %) віддавав принаймні\nодну робочу source map.",[10,147,148],{},"Ми зараховуємо карту лише тоді, коли вона справді відповідає. Адреса в кінці\nстиснутого файлу сама по собі нічого не доводить, бо чимало збірок пишуть\nадресу й ніколи не викладають файл; наш сканер іде за нею і перевіряє, що\nповертається справжня карта. А там, де перевірку не вдалося завершити, ми\nзаписали, що її не вдалося завершити. Застосунок, який ми не змогли\nперевірити, лишається невідомим, а не чистим.",[66,150],{"alt":151,"caption":152,"src":153},"Стиснутий файл бандла, що закінчується рядком sourceMappingURL=index-4f81.js.map, а під ним стоять два можливі результати. В одному запит карти повертає 200 із JSON-файлом і позначений бурштиновим хрестиком: код опубліковано. В іншому повертається 404, позначений зеленою галочкою.","Сама адреса нічого не доводить. Знахідкою є карта, яка відповідає: 404 за цією адресою означає, що налаштування вимкнене, хай там що каже останній рядок бандла.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fdoes-the-map-answer-1600x640.png",[10,155,156,157,160],{},"Два інші числа з того самого обходу ставлять це на своє місце. Витік, про який\nвласників попереджають найчастіше (секретний ключ на сторінці, той, що\nігнорує всі правила бази даних), трапився 3 рази на ці 30 998 застосунків. А\nтаблиця бази даних, яку може читати будь-який сторонній, знайшлася в\n",[34,158,159],{"href":133},"більш ніж половині застосунків, де ту перевірку вдалося завершити",".\nВідкриті source maps стоять між цими двома: значно частіші за славнозвісний\nвитік, значно менш безпосередньо шкідливі за відкриту таблицю. Саме це й\nнамагається сказати середній рівень серйозності.",[17,162,164],{"id":163},"як-вимкнути-source-maps-у-продакшені","Як вимкнути source maps у продакшені",[10,166,167],{},"Одне налаштування збірки, потім новий деплой.",[10,169,170],{},"Якщо ваш застосунок зробив білдер, скажіть йому простими словами, англійською,\nбо саме нею білдери працюють найнадійніше:",[172,173,178],"pre",{"className":174,"code":176,"language":177},[175],"language-text","Disable source map generation for production builds and redeploy.\n","text",[40,179,176],{"__ignoreMap":180},"",[10,182,183,184,187,188,191,192,195],{},"Якщо код у ваших руках, налаштування живе в конфігурації збірки. У проєкті на\nVite (а саме він лежить під більшістю застосунків Lovable і Bolt) це\n",[40,185,186],{},"build.sourcemap: false"," у ",[40,189,190],{},"vite.config","; застосунок на Nuxt має власну опцію\n",[40,193,194],{},"sourcemap",". Задеплойте ще раз і повторіть 30-секундну перевірку: читабельне\nдерево файлів у Sources має зникнути, а лишитися мають тільки стиснуті назви.",[10,197,198,199,202],{},"Дві справи наостанок, перш ніж вважати це закритим. Вимкнення карт не\nповертає копій. Той, хто завантажив вашу карту, поки вона була доступна, має\nваш код таким, яким він був того дня. Тож прочитайте власний код, перш ніж\nрозслаблятися: якщо десь у ньому записано ключ, пароль чи будь-що інше, що не\nмає бути публічним,\n",[34,200,201],{"href":36},"ротуйте це зараз","; прибрана\nкарта зачиняє двері для нових читачів, а не для того, що вже скопійовано. І\nналаштування може повернутися: оновлення шаблону, перегенерована конфігурація\nчи нове місце деплою можуть знову ввімкнути карти без жодного вашого дотику.",[17,204,206],{"id":205},"що-зробити-просто-зараз","Що зробити просто зараз",[208,209,210],"key-takeaways",{},[211,212,213,219,226,229,232],"ul",{},[85,214,215,216,218],{},"Натисніть F12 на живому застосунку, відкрийте Sources і пошукайте теку з назвою ",[40,217,105],{},". Читабельні файли з вашими власними коментарями означають, що ваші source maps опубліковані.",[85,220,221,222,225],{},"Вимкніть їх однією вказівкою білдеру (disable source maps for production builds and redeploy) або самі поставте ",[40,223,224],{},"sourcemap: false"," у конфігурації збірки.",[85,227,228],{},"Прочитайте, що показувала карта, перш ніж розслаблятися. Ключ чи пароль будь-де у вашому коді означає ротацію сьогодні, бо прибрана карта не забирає вже зроблених копій.",[85,230,231],{},"Не чіпайте source maps у розробці. Вони роблять свою роботу, а питання стосується лише опублікованого сайту.",[85,233,234],{},"Повторюйте 30-секундну перевірку після оновлень шаблону й великих деплоїв. Це налаштування має звичку вмикатися само.",[10,236,237,238,242],{},"Саме остання звичка й губиться, бо ніщо не виглядає інакше, коли відповідь\nзмінюється. Reeve Care запускає цей самий скан по вашому живому застосунку за\nрозкладом, разом із цією перевіркою, і пише вам, коли результат гіршає:\n",[34,239,241],{"href":240},"\u002F#pricing","що він відстежує і скільки це коштує",".",[10,244,245,246,250],{},"А якщо зручніше закрити все за один підхід, то\n",[34,247,249],{"href":248},"\u002Fchecklist","10-хвилинний чекліст безпеки"," охоплює це разом з іншими дверима,\nна які варто глянути в щойно запущеному застосунку.",{"title":180,"searchDepth":252,"depth":252,"links":253},3,[254,256,257,258,259,260,261],{"id":19,"depth":255,"text":20},2,{"id":46,"depth":255,"text":47},{"id":76,"depth":255,"text":77},{"id":120,"depth":255,"text":121},{"id":141,"depth":255,"text":142},{"id":163,"depth":255,"text":164},{"id":205,"depth":255,"text":206},"Основи безпеки",null,"Відкрита source map дає будь-кому прочитати оригінальний код вашого застосунку, разом із коментарями. Перевірка за 30 секунд, і що важить насправді.",false,"md",[268,271,274,277,280],{"q":269,"a":270},"Мені сказали, що мої source maps відкриті. Це витік даних?","Ні. Source map містить ваш код, а не дані ваших користувачів. Вашої бази даних у ній немає, як і нічого з сервера. Серйозним це стає лише тоді, коли сам код тримає в собі щось секретне: ключ, пароль, внутрішню адресу. Прочитайте, що насправді написано у вашій, перш ніж вирішувати, наскільки погана ця новина.",{"q":272,"a":273},"Чи можуть украсти мій застосунок, якщо мої source maps публічні?","Можна прочитати ваш фронтенд-код (сторінки, компоненти, логіку в браузері та коментарі), і це робить копіювання ваших ідей легшим, ніж воно було й так. Але не дістатися ні до вашого серверного коду, ні до бази даних, ні до користувачів. Для більшості застосунків практичний ризик полягає не в крадіжці коду, а в секреті, який дорогою опинився в коді.",{"q":275,"a":276},"Як прибрати source maps із продакшен-збірки?","Скажіть своєму білдеру простими словами: disable source map generation for production builds and redeploy. Якщо код у ваших руках, налаштування живе в конфігурації збірки: у проєкті на Vite це build.sourcemap у vite.config; поставте false і задеплойте ще раз. Потім перевірте через F12: читабельне дерево файлів у Sources має зникнути.",{"q":278,"a":279},"А source maps у розробці теж проблема?","Ні. Source maps існують саме для розробки: завдяки їм помилка вказує на справжній файл і рядок, які ви написали, а не на якесь місце в одному величезному стиснутому рядку. Ваш дев-перегляд лишається місцем, куди дивитеся тільки ви. Єдине питання, яке важить: чи віддає їх світові ваш опублікований сайт.",{"q":281,"a":282},"Мій скан каже, що мій вихідний код не опублікований. Я в безпеці?","Це означає, що жодна робоча source map не відповіла, коли ми дивилися, і не більше. Ваш стиснутий код і далі публічний, як у кожного застосунку, а наступний деплой може тихо змінити відповідь, і саме тому перевірку варто повторювати після великих змін.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fcard-800x500.png",[285,286,287,288,289,290,291],"source maps відкриті продакшен","source map витік коду","прибрати source maps з продакшену","чи погано публікувати source maps","відкриті карти коду","sourceMappingURL","vite sourcemap false",{},true,"Відкриті source maps: чи публікує ваш застосунок свій код?","\u002Fblog\u002Fsource-maps-exposed-in-production","2026-08-18",{"title":5,"description":264},"blog\u002Fsource-maps-exposed-in-production",[300,301,302,303],"Відкрита source map дає будь-кому прочитати оригінальний вихідний код вашого застосунку (компоненти, логіку й кожен коментар) просто з браузера.","Сама по собі це не витік. Код не є секретом. Але source map працює як карта до місця, де лежали б ваші секрети, якщо якийсь із них колись потрапив у код.","Кожен восьмий із 30 998 вайб-кодних застосунків, які ми просканували в серпні 2026 року, публікував свої source maps.","Перевірка займає 30 секунд у браузері, а виправлення вміщається в одне налаштування збірки.","Q1Eo37yxnaXHB8S9E_eTHKvmmvcg_phYON4e6ZYoQj0",1787826051154]