Добрый вечер. Столкнулся с проблемой, имею сайт, на котором по кнопке выполняется покупка цифрового товара. Клик по кнопке отправляет post запрос на сервер, обрабатывает данные, отнимает баланс и выдает цифровой товар.
Сегодня нас взломали, отправив 25 команд на сервер за 2 секунды, по всей видимости сервер не до конца справился и баланс пользователю отнял в 10 раз меньше (Стоимость 1 товара 35 рублей, баланс у пользователя был 800, он купил 25 товаров, но баланс стал 700), я повторил его действия, используя консоль хрома отправил 20 копий команды $.post и результат был тот же, товары выдались, но баланс уменьшился лишь на 1/10 от необходимого
Вопрос такой, как можно ограничить количество запрос к 1 url от 1 пользователя скажем на 1 запрос в 2 секунды на стороне сервера? или может есть другие варианты решения проблемы?
Нужно завернуть критическую секцию в транзакцию.
Тогда операции снятия средств и регистрация факта выдачи товара либо будут выполнены полностью, либо не будут выполнены вовсе.
Также имеет смысл блокировать выбранные строки методом lockForUpdate
, чтобы попытка конкурентного обновления вызывала не перезапись, а выбрасывала исключение(с последующим откатом транзакции).
В отличие от sharedLock
этот метод также блокирует чтение строк в других транзакциях.
DB::beginTransaction();
try{
$user = App\User::where('id',auth()->id())->lockForUpdate()->get()->first()
//делаем дела....
$user->save();
DB::commit();
} catch(\Exception $e) {
DB::rollback();
return $e;
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Здравствуйте есть код превью изображений на сайт и проблема в том что кода другое изображение добавляю то оно грузится не там где надо и с повтором...
Как например задать класс второму по счету div, или задать только первому нужные стили, если у каждого однаковые названия классов? Немного...