подскажите:
Есть метод который совершает покупку (проверяет наличие баланса у пользователя, списывает баланс если хватает денег, потом делает несколько операций в базе данных, и выдает пользователю его вещь.
Появилась уязвимость, человек делает двойной запрос в базу данных и у него удается за один и тот же баланс купить 2 таких же предмета (та же история и с продажей, такой же метод только на продажу)
В общем может ли быть такое что PHP обрабатывает 2 запроса одновременно?
Т.е идут 2 запроса, проверяют что есть баланс и пока по одному запросу списывает баланс до второго не успевает дойти информация что баланс списан и скрипт пропускает проверку и выдает пользователю вещь?
сорри, тут не обсуждают пхп (очень на это надеюсь)
еще как обсуждаются xD
Можешь почитать что такое идемподентность запроса
тут проблема больше в атомарности стейта, о таких вещах уже и в пхп давно задумываются
https://habr.com/p/442762/
ну и ещё о транзакциях
Крутая статья спасибо, транзакции не помогут, думаю нужно кэшировать не сервере для защиты от мульти-запросов
Причем здесь PHP это общая проблема, ты с ней столкнёшься на любом ЯП
погугли про data racing и как с ним борятся
Вообще любая операция с деньгами должна сопровождаться транзакцией, имею в виду не бдшую, а отдельную таблицу (фин история) Если у тебя пошел запрос, то деньги списываешь и создаешь фин транзакцию со статусом в обработке, а потом уже окрываешь бдшную транзакцию (и при окончании которой меняешь статус фин транзакции, и при фейле обратно возвращаешь деньги на баланс)
транзакция нужна, если в нескольких местах изменения (и то не всегда)
прочитай внимательнее
там 2 вида транзакций
Ну да, я ниже об этом же написал
Обсуждают сегодня