Bonus Hacking #2. Race Condition в бонусах
В современных сервисах бонусные системы используются в разных обличиях. И я уверен, многие не допускают того, что в тех или иных ситуациях возможно состояние гонки.
Давайте для начала разберем, где вообще может быть состояние гонки.
✅ Оплата товара/услуги бонусами.
✅ Активация промокода
✅ Обмен бонусов на фиат
✅ Активация услуг
✅ Перевод бонусов
Кроме этого, в некоторых сервисах может быть специфический функционал работы с бонусам. Резюмируя, состояние гонки при работе с бонусами может быть практически везде, где происходит обмен, оплата, вывод, активация и перевод.
Разберем один из кейсов, с которым я столкнулся около полугода назад.
При оплате заказа можно было выбрать количество бонусов, которыми мы могли оплатить заказ. При выборе количества бонусов также каждый раз отправлялся новый запрос, который говорил бэкенду, что из общей стоимости заказа бонусами нужно вычесть вот столько.
В этом запросе и было состояние гонки. Имея на счету 10 бонусов с помощью состояния гонки мы могли их накрутить, например, до 90. В итоге, если товар у нас стоил 100 рублей, то со счета деньгами списывалось 10 рублей, если быть точнее, то эти деньги замораживались на счету в банке.
Но в то же время, самое интересное происходило на бекенде, бекенд не понимал, что происходит, откуда взялись эти бонусы и в итоге оплата этих 10 рублей также до конца не проходила и они обратно возвращаются на счет, а заказ уже у меня на пороге.
Почему так произошло?
Все потому что, есть разные уровни обработки этого платежа. На первом уровне, когда мы совершили оплату накрученными бонусами с помощью состояния гонки, бекенд принял это как легитимный запрос. Но на последующих уровнях уже посыпались ошибки потому что не сходится, происходит отмена, но уже поздно, товар то уже на пороге. В итоге бухгалтерия в недоумении.
#bonus #logic
В современных сервисах бонусные системы используются в разных обличиях. И я уверен, многие не допускают того, что в тех или иных ситуациях возможно состояние гонки.
Давайте для начала разберем, где вообще может быть состояние гонки.
✅ Оплата товара/услуги бонусами.
✅ Активация промокода
✅ Обмен бонусов на фиат
✅ Активация услуг
✅ Перевод бонусов
Кроме этого, в некоторых сервисах может быть специфический функционал работы с бонусам. Резюмируя, состояние гонки при работе с бонусами может быть практически везде, где происходит обмен, оплата, вывод, активация и перевод.
Разберем один из кейсов, с которым я столкнулся около полугода назад.
При оплате заказа можно было выбрать количество бонусов, которыми мы могли оплатить заказ. При выборе количества бонусов также каждый раз отправлялся новый запрос, который говорил бэкенду, что из общей стоимости заказа бонусами нужно вычесть вот столько.
В этом запросе и было состояние гонки. Имея на счету 10 бонусов с помощью состояния гонки мы могли их накрутить, например, до 90. В итоге, если товар у нас стоил 100 рублей, то со счета деньгами списывалось 10 рублей, если быть точнее, то эти деньги замораживались на счету в банке.
Но в то же время, самое интересное происходило на бекенде, бекенд не понимал, что происходит, откуда взялись эти бонусы и в итоге оплата этих 10 рублей также до конца не проходила и они обратно возвращаются на счет, а заказ уже у меня на пороге.
Почему так произошло?
Все потому что, есть разные уровни обработки этого платежа. На первом уровне, когда мы совершили оплату накрученными бонусами с помощью состояния гонки, бекенд принял это как легитимный запрос. Но на последующих уровнях уже посыпались ошибки потому что не сходится, происходит отмена, но уже поздно, товар то уже на пороге. В итоге бухгалтерия в недоумении.
#bonus #logic