Всем привет, извините что не совсем по теме, гуру PHP

подскажите:
Есть метод который совершает покупку (проверяет наличие баланса у пользователя, списывает баланс если хватает денег, потом делает несколько операций в базе данных, и выдает пользователю его вещь.

Появилась уязвимость, человек делает двойной запрос в базу данных и у него удается за один и тот же баланс купить 2 таких же предмета (та же история и с продажей, такой же метод только на продажу)

В общем может ли быть такое что PHP обрабатывает 2 запроса одновременно?
Т.е идут 2 запроса, проверяют что есть баланс и пока по одному запросу списывает баланс до второго не успевает дойти информация что баланс списан и скрипт пропускает проверку и выдает пользователю вещь?

16 ответов

21 просмотр

сорри, тут не обсуждают пхп (очень на это надеюсь)

Можешь почитать что такое идемподентность запроса

тут проблема больше в атомарности стейта, о таких вещах уже и в пхп давно задумываются

https://habr.com/p/442762/

Dmitry- Автор вопроса
It's me
https://habr.com/p/442762/

Крутая статья спасибо, транзакции не помогут, думаю нужно кэшировать не сервере для защиты от мульти-запросов

D S
сорри, тут не обсуждают пхп (очень на это надеюсь)

Причем здесь PHP это общая проблема, ты с ней столкнёшься на любом ЯП

погугли про data racing и как с ним борятся

Вообще любая операция с деньгами должна сопровождаться транзакцией, имею в виду не бдшую, а отдельную таблицу (фин история) Если у тебя пошел запрос, то деньги списываешь и создаешь фин транзакцию со статусом в обработке, а потом уже окрываешь бдшную транзакцию (и при окончании которой меняешь статус фин транзакции, и при фейле обратно возвращаешь деньги на баланс)

Oscar S
Вообще любая операция с деньгами должна сопровожда...

транзакция нужна, если в нескольких местах изменения (и то не всегда)

Похожие вопросы

Обсуждают сегодня

Добрый вечер, Пока не совсем понимаю как наладить общение между телеграм ботом и ПО для работы с сим боксом. По самому боту так понял: - Нужен некий баланс, который можно поп...
Magic
6
сделал сайт, прикрутил в боте сайт, и виджет логина. как автоматически логинить пользователя в аккаунт(телеграм), при входе с бота?
Александра Чернивецкая
5
Объясните, пожалуйста, почему компилятор ругается на использование в условии неинициализированной переменной: int x; Task.Run(async () => { x = await somefunc(); }).Wait...
Александр
5
Ребят, подскажите, пожалуйста, почему в префиксе к ассетам, которые генерируются через фильтр | theme в шаблоне, стал вдруг появляться index.php? Вот так выглядит ссылка на а...
Виталий
1
Всем привет. Ребята, подскажите, пожалуйста. у ботов есть ограничение на отправку сообщений - 30 сообщений в секунду, эти ограничения накладываются на все сообщения? или на со...
Artem Stormageddon
4
Блин, ребята, сори за тупые вопросы. А можно ли как-то открыть вебапку по нажатию на кнопку в меню(которое появляется слева, команды)?
Artem Stormageddon
3
а плаксы из-под питона умеют только в комфортных условиях что-то выдавить из себя?)
Lencore
9
Но, может, есть уже проверенная? Наши требования такие: 1. Сообщения должны приходить из Инста в CRM оду 2. Должна быть возможность подключить несколько экаунтов Инстаграм. Р...
Alexander Sharoiko MSE / Александр Шаройко
13
Это может быть все-таки не флудвейт? у меня ботфазер принимает изменения и отображает даже что они изменились, на видео видно что он прислал якобы уже измененное описание, н...
OVERLINK
13
Коллеги, может знает кто, можно ли цвет бейджа счётчика в BackendMenu менять без бубнов?
Alex Blaze
3
Карта сайта