Перейти до вмісту

Основи безпеки

Відкриті source maps: ваш застосунок публікує свій вихідний код

Відкрита source map дає будь-кому прочитати оригінальний код вашого застосунку, разом із коментарями. Перевірка за 30 секунд, і що важить насправді.

Vlad Tkachenko7 хв читання

Коротко

  • Відкрита source map дає будь-кому прочитати оригінальний вихідний код вашого застосунку (компоненти, логіку й кожен коментар) просто з браузера.
  • Сама по собі це не витік. Код не є секретом. Але source map працює як карта до місця, де лежали б ваші секрети, якщо якийсь із них колись потрапив у код.
  • Кожен восьмий із 30 998 вайб-кодних застосунків, які ми просканували в серпні 2026 року, публікував свої source maps.
  • Перевірка займає 30 секунд у браузері, а виправлення вміщається в одне налаштування збірки.

Ви просканували свій застосунок, і один рядок звіту каже: ваш вихідний код опублікований. Або хтось технічний натиснув F12 на вашому сайті й сказав, що ваші source maps відкриті. У будь-якому разі це звучить погано в дуже особистий спосіб: те, що ви будували місяцями, схоже, лежить у всіх на виду, разом із коментарями.

Тривожне прочитання і знизування плечима помиляються обидва. Source map не є секретом. Це карта (назва буквальна) до місця, де лежали б ваші секрети, якщо якийсь із них колись потрапив у код. Чи важить ваша, залежить від того, що всередині, а перевірити це можна приблизно за 30 секунд.

Чи погано, що ваші source maps відкриті?

Це варто виправити цього тижня. І це майже ніколи не привід панікувати цієї ночі.

Відкрита source map показує код, а ваш застосунок і так віддає свій код кожному відвідувачу: стиснутий у нечитабельний блок, але присутній, бо так працює вебсайт. Терплячий сторонній із правильними інструментами міг би відновити приблизну версію і з самого лише стиснутого файлу. Карта прибирає вимогу терплячості: з нею будь-хто, хто натисне F12, читає ваш проєкт таким охайним, яким він виглядає у вашому редакторі.

Наш сканер класифікує опубліковану source map як середній рівень, тобто середину шкали серйозності, і це місце вибране свідомо. Сам по собі читабельний код означає втрату приватності: хтось може вивчити, як працює ваш застосунок, прочитати напівготові функції, позичити ваші ідеї. Неприємно, а для застосунку, чия цінність у дотепному промпті чи незвичному сценарії, це справжня бізнесова проблема. Але не відкрита каса.

Вага змінюється в той день, коли у вашому коді з'являється щось, що ніколи не мало бути кодом. Ключ, який працює як частина застосунку, потрапляє і в стиснутий файл. Карта робить його легшим для пошуку, але опублікований він був і без неї, і це окрема, більша знахідка. Коментарі працюють інакше. Стискання видаляє їх із того, що віддається, тож карта лишається єдиним публічним місцем, де коментар існує. Пароль у закоментованому рядку, нотатка remove before launch над тим, що так і не прибрали, внутрішня адреса, записана поруч із функцією, яка її викликає – до всього цього сторонній не дотягнеться ніде, крім карти.

Що таке source map насправді

Це переклад між кодом, який віддає ваш сайт, і кодом, який написали ви.

Коли застосунок публікується, крок збірки стискає код: усі файли зліплені докупи, кожна назва скорочена до однієї-двох літер, кожен коментар прибраний, усе це в одному велетенському рядку. Браузери виконують це без нарікань. Прочитати його не може ніхто, навіть інструменти, які його збудували, і це стає проблемою тієї миті, коли щось падає, а помилка вказує на рядок 1, символ 48 120 файлу, якого жодна людина ніколи не бачила.

Тому інструменти збірки пишуть другий файл, source map. Він лежить поруч зі стиснутим (app.js отримує app.js.map) і тримає все, що стискання викинуло: ваші оригінальні файли, їхні назви, структуру тек і кожен коментар. Останній рядок стиснутого файлу несе адресу карти, і браузер довантажує карту, щойно відкриваються його інструменти розробника. Оце й увесь задум. Вона існує, щоб помилка могла вказати на код, який ви справді написали.

Саме стиснутий файл виконують ваші відвідувачі. Карта перетворює його назад на проєкт, який ви написали. А коментарі, вирізані з бандла, існують лише на читабельному боці.

Із цього задуму випливають дві речі. Ваші відвідувачі ніколи не завантажують карту (браузер просить її лише тоді, коли відкриті інструменти розробника), тож опублікована карта нічого не коштує, нічого не змінює на екрані й ніколи не дає про себе знати. І будь-що, що може відкрити ваш сайт, може забрати карту, бо адреса записана на сторінці, а входу перед нею немає. Чи лежить там файл, вирішує налаштування збірки, і ззовні «увімкнено» виглядає точнісінько як «вимкнено», доки хтось не піде подивитися.

Як перевірити свій застосунок за 30 секунд

На живому застосунку, тобто на опублікованій адресі, яку відвідують ваші користувачі, а не в передперегляді всередині білдера:

  1. Відкрийте застосунок у Chrome, Edge чи Firefox і натисніть F12. Це відкриє інструменти розробника браузера, ту саму панель, якою скористався б сторонній.
  2. Клацніть вкладку Sources угорі панелі.
  3. Прочитайте дерево файлів ліворуч. Стиснутий код виглядає як один-два файли з назвами на кшталт index-4f81ab2c.js. Source maps виглядають як ваш проєкт: тека з назвою src, файли з іменами ваших сторінок і компонентів, а всередині лежить код, який справді можна читати.

Якщо ви можете відкрити там файл і побачити власні коментарі, ваші source maps опубліковані. Браузер малює це дерево лише тому, що завантажив карту з вашого живого сайту, точно так само, як зробив би браузер будь-кого іншого.

Якщо не хочеться копирсатися в панелях, наш безплатний скан читає ваш живий сайт ззовні й звітує про цю перевірку разом із вісьмома іншими: сканувати застосунок. Це триває близько 20 секунд і не потребує облікового запису.

Що сторонній може побачити, а чого ні

Усе, що ви написали в самому застосунку, і нічого поза ним.

Опубліковані source maps показують ваш фронтенд: сторінки, компоненти, логіку, що працює в браузері, назви маршрутів, які викликає застосунок, будь-який промпт, вписаний у застосунок, і кожен коментар.

До вашого сервера вони не дістають. Код, що працює в edge-функції чи бекенді, залишається там, де є. Вашу базу даних вони теж не відчиняють. Чи може сторонній читати ваші таблиці, вирішують правила на кожній таблиці, а не видимість вашого коду, і це питання ми виміряли окремо на тих самих застосунках.

На практиці шкода від опублікованої карти приходить як тихе читання, а не як ефектний злам: хтось вивчає вашу логіку оплати в пошуках способу її обійти або знаходить адмінський маршрут, на який ніхто ніколи не посилався, і пробує його. Кожне з цього стає проблемою лише тоді, коли знайдене не було захищене. Карта служить путівником для стороннього; вона сама не є відчиненими дверима.

Як часто трапляються опубліковані source maps

У серпні 2026 року ми просканували 30 998 живих застосунків, опублікованих із Lovable, Base44, Replit, v0 і Bolt. Кожен восьмий (13 %) віддавав принаймні одну робочу source map.

Ми зараховуємо карту лише тоді, коли вона справді відповідає. Адреса в кінці стиснутого файлу сама по собі нічого не доводить, бо чимало збірок пишуть адресу й ніколи не викладають файл; наш сканер іде за нею і перевіряє, що повертається справжня карта. А там, де перевірку не вдалося завершити, ми записали, що її не вдалося завершити. Застосунок, який ми не змогли перевірити, лишається невідомим, а не чистим.

Сама адреса нічого не доводить. Знахідкою є карта, яка відповідає: 404 за цією адресою означає, що налаштування вимкнене, хай там що каже останній рядок бандла.

Два інші числа з того самого обходу ставлять це на своє місце. Витік, про який власників попереджають найчастіше (секретний ключ на сторінці, той, що ігнорує всі правила бази даних), трапився 3 рази на ці 30 998 застосунків. А таблиця бази даних, яку може читати будь-який сторонній, знайшлася в більш ніж половині застосунків, де ту перевірку вдалося завершити. Відкриті source maps стоять між цими двома: значно частіші за славнозвісний витік, значно менш безпосередньо шкідливі за відкриту таблицю. Саме це й намагається сказати середній рівень серйозності.

Як вимкнути source maps у продакшені

Одне налаштування збірки, потім новий деплой.

Якщо ваш застосунок зробив білдер, скажіть йому простими словами, англійською, бо саме нею білдери працюють найнадійніше:

Disable source map generation for production builds and redeploy.

Якщо код у ваших руках, налаштування живе в конфігурації збірки. У проєкті на Vite (а саме він лежить під більшістю застосунків Lovable і Bolt) це build.sourcemap: false у vite.config; застосунок на Nuxt має власну опцію sourcemap. Задеплойте ще раз і повторіть 30-секундну перевірку: читабельне дерево файлів у Sources має зникнути, а лишитися мають тільки стиснуті назви.

Дві справи наостанок, перш ніж вважати це закритим. Вимкнення карт не повертає копій. Той, хто завантажив вашу карту, поки вона була доступна, має ваш код таким, яким він був того дня. Тож прочитайте власний код, перш ніж розслаблятися: якщо десь у ньому записано ключ, пароль чи будь-що інше, що не має бути публічним, ротуйте це зараз; прибрана карта зачиняє двері для нових читачів, а не для того, що вже скопійовано. І налаштування може повернутися: оновлення шаблону, перегенерована конфігурація чи нове місце деплою можуть знову ввімкнути карти без жодного вашого дотику.

Що зробити просто зараз

Що робити

  • Натисніть F12 на живому застосунку, відкрийте Sources і пошукайте теку з назвою src. Читабельні файли з вашими власними коментарями означають, що ваші source maps опубліковані.
  • Вимкніть їх однією вказівкою білдеру (disable source maps for production builds and redeploy) або самі поставте sourcemap: false у конфігурації збірки.
  • Прочитайте, що показувала карта, перш ніж розслаблятися. Ключ чи пароль будь-де у вашому коді означає ротацію сьогодні, бо прибрана карта не забирає вже зроблених копій.
  • Не чіпайте source maps у розробці. Вони роблять свою роботу, а питання стосується лише опублікованого сайту.
  • Повторюйте 30-секундну перевірку після оновлень шаблону й великих деплоїв. Це налаштування має звичку вмикатися само.

Саме остання звичка й губиться, бо ніщо не виглядає інакше, коли відповідь змінюється. Reeve Care запускає цей самий скан по вашому живому застосунку за розкладом, разом із цією перевіркою, і пише вам, коли результат гіршає: що він відстежує і скільки це коштує.

А якщо зручніше закрити все за один підхід, то 10-хвилинний чекліст безпеки охоплює це разом з іншими дверима, на які варто глянути в щойно запущеному застосунку.

Поширені запитання

Мені сказали, що мої source maps відкриті. Це витік даних?

Ні. Source map містить ваш код, а не дані ваших користувачів. Вашої бази даних у ній немає, як і нічого з сервера. Серйозним це стає лише тоді, коли сам код тримає в собі щось секретне: ключ, пароль, внутрішню адресу. Прочитайте, що насправді написано у вашій, перш ніж вирішувати, наскільки погана ця новина.

Чи можуть украсти мій застосунок, якщо мої source maps публічні?

Можна прочитати ваш фронтенд-код (сторінки, компоненти, логіку в браузері та коментарі), і це робить копіювання ваших ідей легшим, ніж воно було й так. Але не дістатися ні до вашого серверного коду, ні до бази даних, ні до користувачів. Для більшості застосунків практичний ризик полягає не в крадіжці коду, а в секреті, який дорогою опинився в коді.

Як прибрати source maps із продакшен-збірки?

Скажіть своєму білдеру простими словами: disable source map generation for production builds and redeploy. Якщо код у ваших руках, налаштування живе в конфігурації збірки: у проєкті на Vite це build.sourcemap у vite.config; поставте false і задеплойте ще раз. Потім перевірте через F12: читабельне дерево файлів у Sources має зникнути.

А source maps у розробці теж проблема?

Ні. Source maps існують саме для розробки: завдяки їм помилка вказує на справжній файл і рядок, які ви написали, а не на якесь місце в одному величезному стиснутому рядку. Ваш дев-перегляд лишається місцем, куди дивитеся тільки ви. Єдине питання, яке важить: чи віддає їх світові ваш опублікований сайт.

Мій скан каже, що мій вихідний код не опублікований. Я в безпеці?

Це означає, що жодна робоча source map не відповіла, коли ми дивилися, і не більше. Ваш стиснутий код і далі публічний, як у кожного застосунку, а наступний деплой може тихо змінити відповідь, і саме тому перевірку варто повторювати після великих змін.

Автор

Vlad Tkachenko

Засновник Reeve

Я щодня дивлюся на застосунки, зібрані в Lovable, Bolt, v0, Cursor і Replit, і на короткий список помилок, які трапляються в них знову і знову.

Більше про автора

Читати далі

Не впевнені, як справи у вашому застосунку?

Запустіть безкоштовне сканування й отримайте зрозумілу оцінку від A до F приблизно за 20 секунд. Без облікового запису й без картки.

Сканувати безкоштовно

Автоматична зовнішня перевірка, а не повний аудит. Відсутність знахідок не є гарантією безпеки.