Fuente
QA Co-pilot | Стан перегонів" (Race Condition): Як подвійний клік краде гроші бізнес...
31 Vistas/Alcance
2026-03-04 09:31
Mensaje №216
🏎 "Стан перегонів" (Race Condition): Як подвійний клік краде гроші бізнесуПривіт, екіпаж! Екватор тижня — ідеальний час для технічної магії. ☕️Уявіть ситуацію: користувач купує останній акційний ноутбук в інтернет-магазині. Інтернет трохи "тупить", кнопка "Оплатити" не реагує миттєво. Користувач нервує і клікає на неї тричі поспіль.Що відбувається далі? З картки списуються гроші три рази, система створює три замовлення на один і той самий "останній" ноутбук, а на складі починається паніка.Вітаю, ви зустріли Race Condition (Стан перегонів).Чому це відбувається "під капотом"?Коли сервер отримує три запити одночасно, він починає обробляти їх паралельно (у різних потоках).
🔹Потік 1 питає базу: "Ноутбуки є?". База: "Так, 1 штука".🔹Потік 2 в ту саму мілісекунду питає: "Ноутбуки є?". База ще не встигла оновитися і відповідає: "Так, 1 штука".🔹Потік 3 чує те саме.
У результаті сервер радісно продає один фізичний товар трьом різним людям, заганяючи залишки на складі в мінус.Як крутий QA має це тестувати?👆 "Паркінсон" на UIНайпростіший тест — просто швидко-швидко клікати на будь-які деструктивні кнопки: "Зберегти", "Відправити", "Оплатити", "Видалити".Часто розробники забувають зробити кнопку неактивною (disabled) одразу після першого кліку, залишаючи вікно вразливості.
🐌 Метод "Повільного інтернету"Якщо інтернет швидкий, ви просто не встигнете клікнути двічі. Тому відкриваємо DevTools -> Network -> ставимо Slow 3G. Тепер запит "висить" 5 секунд, і у вас є купа часу, щоб натиснути кнопку ще 10 разів.
🤖 API-бомбардуванняUI-блокування кнопки — це лише захист від дурня. Хакер просто обійде UI і відправить запити напряму. Беремо Postman або JMeter і відправляємо 20 однакових POST-запитів в одну секунду паралельно. Якщо створилося 20 записів — архітектура бекенда дірява.
Як це фіксять здорові команди?Надійні системи використовують Ідемпотентність (idempotency keys) — коли разом із запитом передається унікальний ID транзакції. Навіть якщо клієнт надішле 10 однакових запитів, сервер зрозуміє, що це дублі, і виконає дію лише один раз. Інший варіант — строгі блокування (Locks) на рівні самої бази даних.А ви перевіряєте критичні форми на подвійний клік?🔥 — Завжди клікаю як скажений(а)!👀 — Тестую на UI, але в API не ліз...🤷♂️ — Якщо юзер клікає двічі, це його проблеми!