Что я нашёл в вашем проекте

Нашёл 1 место, где чужие данные может открыть посторонний, 2 места, где данные могут потеряться незаметно и 2 мелочи.

Каждая находка ниже с точным файлом и строкой. Их можно передать разработчику как есть: спорить там не с чем, это его собственный код против его же привычки.

Проект «shop», разобран 01.09.2026

🔴 1🟡 2⚪ 2🔍 1
НаходкиПуть клиента

🔴 Смотреть в первую очередь · 1

Права

Чужие данные может открыть посторонний

Страница отдаёт запись по её номеру, не проверяя, кому она принадлежит. Человек, подставивший чужой номер в адресную строку, увидит чужой заказ.

Технически: точка входа не проверяет, кто спрашивает. В 16 точках входа из 17 стоит проверка прав, здесь её нет. Если это не публичный доступ по замыслу, данные отдаются любому, кто знает адрес.

src/app/api/orders/[id]/route.ts:5

GET src/app/api/orders/[id]/route.ts

🟡 Может сломаться незаметно · 2

Проглоченная ошибка

Данные могут не сохраниться, и никто не заметит

Приложение записывает данные и не смотрит, получилось ли. Если база откажет, оно продолжит так, будто всё прошло: человек увидит «готово», а записи не будет.

Технически: результат записи в базу не проверяется. В 40 обращениях к базе из 42 результат проверяют, здесь нет. Клиент базы при отказе не бросает исключение, а возвращает ошибку в ответе: не посмотрев в ответ, код продолжает так, будто запись прошла.

src/app/api/addresses/delete/route.ts:11

supabase.from('addresses').delete
Проглоченная ошибка

Данные могут не сохраниться, и никто не заметит

Приложение записывает данные и не смотрит, получилось ли. Если база откажет, оно продолжит так, будто всё прошло: человек увидит «готово», а записи не будет.

Технически: результат записи в базу не проверяется. В 40 обращениях к базе из 42 результат проверяют, здесь нет. Клиент базы при отказе не бросает исключение, а возвращает ошибку в ответе: не посмотрев в ответ, код продолжает так, будто запись прошла.

src/app/api/checkout/route.ts:30

supabase.from('orders').insert

⚪ Мелочи · 2

Недостижимый экран

Экран написан, но попасть на него нельзя

Работа сделана и оплачена, а открыть эту страницу в приложении нечем: ни одна кнопка на неё не ведёт. Либо забыли добавить вход, либо она осталась от прошлой версии.

Технически: на экран «/product» не ведёт ни одна кнопка. Экран написан, но ни кнопки на него, ни упоминания его адреса в коде не нашлось. Похоже, он остался от прошлой версии.

src/app/product/page.tsx:1

Недостижимый экран

Экран написан, но попасть на него нельзя

Работа сделана и оплачена, а открыть эту страницу в приложении нечем: ни одна кнопка на неё не ведёт. Либо забыли добавить вход, либо она осталась от прошлой версии.

Технически: на экран «/subscribe» не ведёт ни одна кнопка. Экран написан, но ни кнопки на него, ни упоминания его адреса в коде не нашлось. Похоже, он остался от прошлой версии.

src/app/subscribe/page.tsx:1

🔍 Что я проверить не смог · 1

Здесь я не уверен: что-то спрятано за вызовом функции, что-то не разобралось. Ошибки тут может и не быть. Отдай список агенту, который писал код, - пусть пройдёт по пунктам и скажет по каждому, есть дыра или нет.

Не смог разобрать

Это место я разобрать не смог

Здесь адрес собирается на ходу, и куда ведёт кнопка - из кода не видно. Ошибки может и не быть; проверить это должен человек, который писал код.

Технически: не разобрал 1 кнопку на этом экране. Причина: location.href: адрес собирается в рантайме. Куда она ведёт и что делает - неизвестно, поэтому дыры в этом месте я не увижу. Проверь её сам или поручи агенту.

src/components/checkout-button.tsx:17

Ниже - тот же список в виде текста. Его можно целиком передать разработчику или ИИ-агенту, который писал код: там указаны файлы, строки и основание по каждому пункту.