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

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

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

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

16 ответов

5 просмотров

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Сonst magicTgHTML = (text, entities) => { let processedText = text; let offsetShift = 0; entities.forEach(entity => { const { offset, length, type, url, ...
Андрей
1
В смысле более затратная? Общая стоимость владения лошадью меньше, чем автомобиля. В среднем.
Sergej R
10
Вы когда из вики.... копировали, не обратили внимание на года(ы)? 😉 ==== если до 1917 года в Москве было около 15 000 легковых извозчиков, то к 1920 году их осталось 5 000, а ...
Igor Mitin
4
Кстати, раз про скачивание файлов разговор зашел) Сделал бота для себя (транскрибирующего и суммаризирующего встречи) но не ожидал что за 2 месяца 10к пользователей набежит😅...
Andrey Obolenskiy
8
t.me/<username> и tg://user?id=<id> отваливаются по понятным причинам
Denis 🐍|👑 | darling! 🥰
7
коллеги привет. уже второй день бьемся об заклад с одной ошибкой, может вы сталкивались с таки странным поведением? есть тестовый сервер, на который паблишим релизную версию W...
Magzhan
11
На счёт замены разрабов нейронами: Вряд-ли заказчик сможет нормально пояснить нейросети, чё он хочет. Они то человеку нормально пояснить не могут, не то что нейросети. Так что...
Alex Kom
1
Что я могу сказать? Погуглите получше - чтобы узнать: 1. Что будет стоить содержание машины 2. Что будет стоить содержании лошади. P.S. Моя мысль о том, повторюсь еще раз,...
Igor Mitin
1
Слушайте, а при создании навигации на Tailor рили нельзя определять активный пункт навигации, как в Static Pages?
Pavel Lautsevich
11
Как Яндекс помог извозчику из 1914? ))) Более того, Яндекс условный уничтожил сверхдоходы уксусов в свое время Мне как пассажиру - каеф. Оодскульным ленивым и наглым таксиста...
Sergej R
1
Карта сайта