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

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

Сканування безпеки Lovable: чого воно не доведе

Сканування безпеки Lovable: що перевіряють Quick scan і Deep scan, коли запускається кожне, і єдине, чого не доведе жодне сканування зсередини.

Vlad Tkachenko9 хв читання
Панель звіту зі стовпчиком галочок, а за нею база даних, що виходить за край кадру, і рядки, які з неї випливають.

Коротко

  • Сканування безпеки Lovable насправді є двома скануваннями, обидва безкоштовні: Quick scan запускається сам щоразу, коли ви публікуєте, а Deep scan ви запускаєте власноруч, і він читає весь код вашого застосунку.
  • Обидва читають ваш проєкт зсередини. Жодне з них не робить запит, який робить незнайомець, тож жодне не доведе, що віддає ваш опублікований застосунок.
  • Із 3 553 застосунків Lovable, чию базу Supabase ми змогли запитати ззовні, 2 017 відповіли на запит без входу в акаунт. Запускайте сканування зсередини перед публікацією, а зовнішнє після неї.

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

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

Чи перевіряє Lovable мій застосунок на проблеми з безпекою?

Так, і їх два. Обидва безкоштовні.

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

Усе, що нижче, прочитано у власній документації Lovable про безпеку24 вересня 2026 року. Ця функція змінювалася за рік не раз, тож дивіться на дату будь-якої статті, яка її описує, включно з цією.

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

Що перевіряє сканування безпеки Lovable

Три ділянки, як фіксований набір перевірок, за секунди, під час кожної публікації.

Документація Lovable називає їх оглядом бази даних, аудитом залежностей і перевіркою сервера MCP. Огляд бази даних це те, що важить для цієї статті, і його опис варто прочитати повільно: він охоплює таблиці без контролю доступу до окремого запису, тобто без Row Level Security, а також правила доступу, які пропускають усіх, і вимкнений захист від викрадених паролів. Аудит залежностей шукає відомі вразливості у ваших пакетах npm. Перевірка MCP шукає сервер MCP, який ваш застосунок віддає назовні без автентифікації.

Знахідки повертаються згрупованими за ділянками і позначеними як Critical, Warning або Info. Сканування спрацьовує автоматично з діалогу публікації, і ви також можете запустити його з розділу Security у проєкті.

Деякі тексти називають це Basic scan. Кнопка в розділі Security сьогодні каже Run quick scan, тож якщо стаття і ваш екран не сходяться в назві, актуальний ваш екран.

Що додає Deep scan

Він читає весь код вашого застосунку і не запускається сам.

Deep scan містить усе з Quick scan, а потім дивиться на вашу власну логіку, ваші дозволи й ваші дані. Lovable перелічує сім ділянок: контроль доступу й авторизація, неавтентифіковані та придатні до зловживання точки входу, небезпечне введення та ін’єкції, витік секретів і облікових даних, платежі й рахунки, автентифікація та безпека акаунтів, а також відкриті персональні й чутливі дані. Він теж безкоштовний.

Речення з документації, за яким справді треба діяти, таке: Deep scan не запускається автоматично, поки ви працюєте. Він запускається тоді, коли ви його запускаєте. У проєкті, де його ніколи не запускали, код ніколи не читали, хоч би скільки разів проєкт публікували, і діалог публікації вам про це не скаже. Робочі простори Enterprise можуть планувати Deep scan для вибраних проєктів у Workspace Security center, і це єдина конфігурація, де воно стається без того, щоб хтось згадав.

Lovable також може спробувати виправити знайдене, поки ви будуєте або через Try to fix all у розділі Security. Прочитайте, що змінило виправлення, перш ніж його прийняти. Полагодження, від якого зникає помилка row level security, це дуже часто політика, яка пропускає всіх, і така політика задовольняє перевірку й лишає таблицю відкритою.

Претензія 2025 року і що змінилося

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

У травні 2025 року Метт Палмер оприлюднив CVE-2025-48757 про застосунки Lovable, у яких таблиці Supabase не мали row level security або мали його написаним надто широко. Відповіддю Lovable стала перевірка перед публікацією. Власний текст Палмера описав її межу в одній дужці:

Функція Publish у Lovable допомагає переконатися, що політики RLS увімкнені на всіх таблицях, і повідомляє, коли це не так (але не обов’язково показує, чи вони достатні).

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

Чого не доведе сканування зсередини

Чи віддає ваш живий застосунок рядки тому, хто не увійшов у акаунт.

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

  • Політика пропускає всіх. Записана як using (true), вона є чинною політикою, вона задовольняє вимогу, щоб політика існувала, і повертає кожен рядок кожному, хто звернувся.
  • Політика покриває читання і більше нічого. Select перевіряється, insert, update і delete ніхто не писав, тож будь-хто може писати в таблицю, яку ніхто не може прочитати повністю.
  • Умова збігається з більшою кількістю людей, ніж мала. Вона мала назвати одного клієнта, а називає кожного відвідувача з відкритою сесією, або кожного відвідувача.

Тепер частина, яка вирішує, як читати зелений результат. Ззовні ці три випадки й таблиця взагалі без захисту дають однакову відповідь, і це рядки. Ваші користувачі їх не розрізняють. Усі інші, хто відкриє ваш застосунок, теж ні.

Запит, який усе вирішує, і рядки, з якими він повернувся. Проєкт стоїть під сторінкою і ніде не торкається лінії, і саме тому ніщо всередині нього не відповість за те, що тут сталося.

Між 12 і 14 серпня 2026 року ми прогнали ті самі дев’ять зовнішніх перевірок по 30 998 живих застосунках, і 18 554 з них були опубліковані на Lovable. Серед застосунків Lovable, які називали проєкт Supabase, 3 553 відповіли нам досить чітко, щоб їх оцінити, і 2 017 із них віддали рядки на запит, який не ніс жодного входу в акаунт. Метод і кожен знаменник є у звіті.

Одне чесне застереження до цього числа. Ми стояли на тротуарі, і ми не маємо жодного погляду всередину цих проєктів. Ми можемо повідомити, що відповіли 2 017 опублікованих застосунків. Ми не можемо повідомити, скільки з них запускали сканування і що воно їм сказало.

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

Чого не побачить сканування ззовні

Натиснути ручку не скаже вам нічого про кімнату, яка не має дверей на вулицю, а таких чотири.

Ваше дерево залежностей npm не лежить на сторінці, яку завантажує браузер. Ваш серверний код, включно з edge functions і тим, чи перевіряє маршрут, хто звертається, працює там, куди ми ніколи не дістаємося. Таблиця, яку ваш фронтенд ніколи не називає, для нас невидима, бо ми знаходимо назви таблиць у коді, який віддає ваш застосунок, плюс короткий перелік поширених назв: таблицю, якої в браузері немає ніде і яку ніхто не вгадав би, ми просто не питаємо. А сервер MCP не є тим, що знаходить запит сторінки.

Два сканування Lovable разом читають усі чотири. Наше пише «Не вдалося перевірити», коли воно не змогло відповісти на питання, замість галочки.

Про що йдетьсяСканування Lovable, зсерединиСканування ззовні
Row level security вимкнено на таблиціТакЛише за наслідком
Політика, яка пропускає всіхТак, за їхньою документацієюТак, за рядками
Що ваш опублікований застосунок віддає незнайомцюНіТак, це вся робота
Ваші залежності npmТакНі
Серверний код і автентифікація edge functionsТакНі
Таблиця, яку ваш фронтенд ніколи не називаєТакНі
Який ключ опинився в коді, що його завантажують відвідувачіТакТак
Дата сертифіката, дата домену і заголовки сторінкиНемає в їхньому перелікуТак

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

Обидва, і в такому порядку

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

  1. Дайте Quick scan відпрацювати під час публікації, а тоді прочитайте його. Це кілька секунд, і воно однаково відбувається. Проклацати діалог це найпоширеніший шлях, яким знахідка Critical потрапляє в продакшн.
  2. Запустіть Deep scan перед тим, як щось справжнє піде в люди, і ще раз після того, як додасте вхід, платежі чи будь-яку таблицю з людьми. Сам він не запуститься.
  3. Опублікуйте.
  4. Проскануйте опубліковану адресу ззовні. Наше читає ваш живий застосунок так, як його читає відвідувач, триває близько 20 секунд, не потребує акаунта і називає перевірки, які не змогло завершити: просканувати застосунок.

У цій послідовності є проміжок, і саме з ним варто рахуватися. Quick scan працює, коли ви публікуєте. Більшість того, що відкриває таблицю, взагалі не проходить через публікацію: ви змінюєте налаштування в панелі Supabase, ви опівночі приймаєте політику, яку асистент написав у вікні чату, ви створюєте таблицю зранку, а екран, що її читає, виходить у четвер. Ніщо з цього не є публікацією, тож ніщо з цього не запускає сканування, а Deep scan і так ніколи не запустився б сам.

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

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

Як читати зелений результат

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

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

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

Якщо ваш застосунок на Supabase, покроковий розбір простою мовою для цієї платформи це чи безпечний ваш застосунок Lovable, а перевірки, записані як команди, які ви запустите самі, є в перевірці безпеки Supabase.

Що зробити цього тижня

Що робити

  • Читайте результат Quick scan під час публікації, замість проклацувати його, і сприймайте позначку Critical як те, що лагодять до виходу застосунку.
  • Запустіть Deep scan руками. Сам він не стартує, тож у проєкті, де його ніколи не запускали, код ніколи не читали.
  • Після публікації проскануйте живу адресу ззовні. Це єдина перевірка, яка робить запит, що його робить незнайомець.
  • Прочитайте політику на кожній таблиці, де лежать люди. Та, що пропускає всіх, лишає таблицю відкритою, поки панель вважає її захищеною.
  • Перевірте, що ключ у вашому застосунку публічний. Які ключі API безпечні у фронтенді показує, як відрізнити одні від одних.
  • Коли відповіді зсередини і ззовні розходяться, ваші користувачі отримують зовнішню.

Якщо ваш застосунок на Lovable використовує Supabase, відкрийте приватне вікно браузера і пройдіться списком у розділах Authentication та Policies до п’ятниці. Чи може будь-хто прочитати вашу базу Supabase це той самий тест, записаний як команди, які можна вставити в термінал.

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

Чи перевіряє Lovable мій застосунок на проблеми з безпекою?

Так, і сканувань два. Quick scan запускається сам щоразу, коли ви публікуєте, і завершується за секунди, охоплюючи правила доступу вашої бази, ваші залежності npm і будь-який сервер MCP, який ваш застосунок віддає назовні без автентифікації. Deep scan читає весь код вашого застосунку, і запустити його треба самому з розділу Security у проєкті. Обидва безкоштовні, і обидва читають ваш проєкт, а не ваш опублікований застосунок.

Яка різниця між Quick scan і Deep scan?

Швидкість і глибина. Quick scan виконує фіксований набір перевірок за секунди, автоматично під час публікації, і охоплює налаштування бази, залежності та відкритість MCP. Deep scan містить усе з Quick scan, а потім читає код вашого застосунку в пошуках проблем, притаманних саме вашій логіці та вашим даним: контроль доступу, неавтентифіковані точки входу, ін’єкції, витік секретів, платежі, безпека акаунтів і відкриті персональні дані. Deep scan не запускається сам, поки ви працюєте, тож у проєкті, де його ніколи не запускали, код ніколи не читали.

Чи достатньо сканування безпеки Lovable?

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

Чому зовнішній сканер знаходить те, що сканування Lovable пропустило?

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

Чи потрібні мені обидва?

Вони відповідають на різні питання, тож одне не замінює інше. Корисний порядок це порядок, у якому ці дві речі стаються: дайте Quick scan відпрацювати під час публікації, запустіть Deep scan перед тим, як щось справжнє піде в люди, і ще раз після того, як додасте вхід, платежі чи таблицю з людьми, а тоді проскануйте опубліковану адресу ззовні. Зовнішнє сканування триває близько 20 секунд і не потребує акаунта.

Автор

Vlad Tkachenko

Засновник Reeve

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

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

Читати далі

Усі статті

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

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

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

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