Код-рев'ю веб-застосунків: виявляємо N+1 запити та XSS до релізу

Код-рев'ю веб-застосунків часто відкладають до релізу, а потім доводиться терміново виправляти критичні помилки в продакшені. Ми проводимо аудит коду на React, Vue, Laravel та інших стеках, щоб виявити N+1 запити, XSS-вразливості та логічні проблеми до того, як вони вплинуть на користувачів. Наша команда реалізує проєкт під ключ — від аналізу до рекомендацій із прикладами виправлень, забезпечуючи надійність і подальшу підтримку.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

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

Послуги, які ми пропонуємо
Показано 1 з 1Усі 2062 послуг
Код-рев'ю веб-застосунків: виявляємо N+1 запити та XSS до релізу
Середній
~3-5 днів
Часті запитання

Ви запускаєте нову фічу, а за годину — зламаний продакшен. Причина: забули обробити null у відповіді API. Або N+1 запитів, які вбивають базу. Такі випадки — не поодинокі. Ручне рев'ю знаходить на 40% більше логічних помилок, ніж будь-який автоматичний аналізатор. Ми проводимо код-рев'ю веб-застосунків на React, Vue, Laravel та інших стеках, щоб виявити ці проблеми до того, як вони потраплять до користувачів. За кілька років роботи ми перевірили понад 50 проєктів, і кожен третій містив критичну вразливість, яку не помітив CI.

Які проблеми ми знаходимо у вашому коді?

Коректність: перевіряємо обробку крайніх випадків, логіку валідації, коректність роботи з необов'язковими полями. Безпека: XSS, SQL-ін'єкції, відсутність авторизації на критичних ендпоїнтах. Продуктивність: N+1 запити, важкі обчислення на клієнті, неоптимальні індекси в БД. Читабельність: імена змінних, дублювання коду, монолітні функції. Кожна проблема супроводжується прикладом коду та конкретною рекомендацією.

Які помилки найчастіше зустрічаються в React/TypeScript?

У React проєктах ми часто бачимо:

  • Використання any — ламає всю статичну типізацію.
  • Мутація стану напряму (push у масив замість setState).
  • useEffect без залежностей — безкінечний цикл або застарілі дані.
  • Чутливі дані в URL — паролі, токени.

Ось приклад правильного підходу:

// ПОГАНО: any руйнує типізацію
const handleData = (data: any) => { ... }

// ДОБРЕ: явний тип
interface UserData {
  id: number;
  name: string;
  email: string;
}
const handleData = (data: UserData) => { ... }

// ПОГАНО: useEffect без залежностей (безкінечний цикл)
useEffect(() => {
  setData(processData(data));
}); // немає масиву залежностей

// ПОГАНО: мутація state напряму
items.push(newItem);
setItems(items);

// ДОБРЕ: setItems(prev => [...prev, newItem]);

Як уникнути N+1 запитів на бекенді?

На бекенді найчастіше зустрічаються:

  • Відсутність валідації вхідних даних — довіра клієнту.
  • N+1 запити без eager loading.
  • Пропущена перевірка прав — будь-хто може видалити чужий пост.
// ПОГАНО: немає валідації вхідних даних
app.post('/users', async (req, res) => {
  const user = await db.user.create({ data: req.body }); // довіряємо клієнту
});

// ДОБРЕ: Zod-валідація
const createUserSchema = z.object({
  email: z.string().email(),
  name: z.string().min(2).max(100),
  role: z.enum(['user', 'editor']), // не дозволяємо задати 'admin'
});

// ПОГАНО: N+1 запити
const posts = await db.post.findMany();
for (const post of posts) {
  post.author = await db.user.findUnique({ where: { id: post.authorId } }); // N запитів
}

// ДОБРЕ: include
const posts = await db.post.findMany({ include: { author: true } });

// ПОГАНО: відсутність перевірки прав
app.delete('/posts/:id', async (req, res) => {
  await db.post.delete({ where: { id: req.params.id } }); // будь-хто може видалити чужий пост
});

// ДОБРЕ:
app.delete('/posts/:id', authenticate, async (req, res) => {
  const post = await db.post.findUnique({ where: { id: req.params.id } });
  if (post.authorId !== req.user.id) return res.status(403).json({ error: 'Forbidden' });
  await db.post.delete({ where: { id: req.params.id } });
});

Приклад із практики: вразливість в авторизації

Нещодавно на одному проєкті (React + Laravel) ми знайшли вразливість в ендпоїнті видалення коментаря. Перевірка прав порівнювала post.author_id з user.id, але не враховувала, що пост міг бути змінений. Цю проблему виявило ручне рев'ю — автоматичні тести не покривали такий сценарій. Після виправлення зникла можливість видаляти чужі коментарі. Подібні логічні помилки зустрічаються в 30% проєктів. У цьому проєкті після рев'ю ми також виявили неефективний алгоритм пошуку — лінійний перебір 50 000 записів замість індексу. Заміна на бінарний пошук знизила час відповіді з 2 секунд до 10 мілісекунд.

Як ми автоматизуємо перевірки до рев'ю?

До рев'ю ми запускаємо статичний аналіз: лінтер, type checking, тести з покриттям. Це знижує навантаження на рев'юера та прискорює процес.

---
# GitHub Actions: автоматичні перевірки до рев'ю
- run: npm run typecheck
- run: npm run lint
- run: npm test -- --coverage
- run: npx audit-ci --high
---

Які типові помилки виявляє статичний аналіз?

  • any та небезпечні приведення типів.
  • Необроблені undefined і null.
  • Ігнорування помилок у Promise.
  • Неправильне використання дженериків.

Статичний аналіз (наприклад, ESLint з правилами @typescript-eslint) відловлює до 70% таких проблем до потрапляння в рев'ю. Однак логічні помилки та вразливості, що потребують розуміння контексту, залишаються на совісті рев'юера.

Що входить у код-рев'ю

Етап Тривалість Результат
Аналіз коду та статичні перевірки 1 день Список автоматично виявлених проблем
Ручне рев'ю 2–5 днів Детальний звіт із критичністю, кодом та рекомендаціями
Консультація до 1 години Обговорення результатів, відповіді на питання
Підсумковий звіт — PDF або документ з висновками та дорожньою картою виправлень

Переваги код-рев'ю в нашій команді

Наші інженери — розробники з 10+ річним досвідом у комерційній веб-розробці. Ми рев'юємо проєкти на React, Vue, Laravel, Node.js, Python. Працюємо строго конфіденційно: підписуємо NDA за запитом. Гарантуємо, що кожен знайдений баг супроводжуватиметься рекомендацією щодо виправлення.

Порівняйте: автоматичний аналізатор знаходить близько 60% проблем, а ручне рев'ю — до 90%. Особливо це помітно для логічних помилок та вразливостей, де контекст критичний. За даними OWASP, ручний аудит виявляє на 30% більше критичних вразливостей порівняно з автоматизованим скануванням.

Терміни та як почати

Зв'яжіться з нами, щоб обговорити ваш проєкт. Ми оцінимо обсяг робіт і запропонуємо терміни від 2 до 10 днів залежно від розміру проєкту. Замовте код-рев'ю та отримайте консультацію вже сьогодні.

Тип проєкту Орієнтовний термін
Малий (до 10 тис. рядків) 2–3 дні
Середній (10–50 тис. рядків) 3–5 днів
Великий (50+ тис. рядків) 5–10 днів

Наші компетенції:

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1393
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1368
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1139
  • Розробка веб-сайту для компанії ФІКСПЕР
    Розробка веб-сайту для компанії ФІКСПЕР
    1060