Как смогли обойти проверку и украсть средства?

213
22 октября 2017, 23:05

Ребят, приветствую. На сайте случалась ситуация, что один из пользователей смог обойти проверку и украсть средства. После просмотра, увидел, что у пользователя в базе был отрицательный баланс. Просьба, помочь и навести на мысль, заранее премного благодарен.

PHP:

    $user = mysqli_fetch_assoc(mysqli_query($CONNECT, "SELECT * FROM `users` WHERE `login` = '$_SESSION[USER_LOGIN]'"));// сессия присваивается после авторизации
    $balance = $user['balance'];//переменная с данными пользователя
    if ( isset($_POST['cashout']) ) {
        if ( $_POST['amount'] >= 10 ) {
            if ( $_POST['amount'] <= $balance ) {
                // Здесь скрипт выполняющий вывод средств и обновляющий баланс в БД
                $balance_res = $balance - $_POST['amount'];
                mysqli_query($CONNECT, "UPDATE `users`  SET `balance` = $balance_res WHERE `id` = '$us_id'");
                MessageSend(2, 'Средства успешно выведены', '/cashout');
            } else {
                MessageSend(1, 'Недостаточно средств', '/cashout');
            }
        } else {    
            MessageSend(1, 'Минимальная сумма 10 рублей.', '/cashout');
        }
    }

Форма:

<form action="/cashout" method="POST">
    Кому: <input type="text" class="form-control" name="payeer" placeholder="Payeer кошелек">
    Сколько: <input type="number" name="amount" class="form-control" placeholder="Сумма в рублях">
    <input type="submit" name="cashout" value="Cash Out">
</form>
Answer 1

Неявное пребразование типов. Вот пример

<?php
$ammount=' 050w00';
$balance='40'; //<-- важно, что это строка
if($ammount>=10){
    if($ammount<=$balance){
       $balance=$balance-$ammount;
    }
}
print('balance:'.$balance);
balance:-10
Answer 2

Возможно подмена сессионных данных $_SESSION[USER_LOGIN] на другое имя с положительным балансом а вывод и update таблиц иже идет у Вас по id.

Не видно еще кода, когда в массив записывается стояния кошелька, $user['balance']

Answer 3

Может дело в том что у вас всё это не в транзакции? Пользователь взял, подготовил запрос, 4 штуки, они всё в одну секунду проверили баланс, он положительный, и списали, вот у вас и минус

READ ALSO
PHP поиск в многомерном массиве

PHP поиск в многомерном массиве

Дан список студентов, необходимо сделать выборку и вывести список студентов которые проживают в общежитии и получают стипендиюКак искать...

246
Нужно записать массив в файл

Нужно записать массив в файл

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

158
Laravel Middleware

Laravel Middleware

Есть Laravel Middleware, который должен перенаправлять если пользователь не залогинен со следсодержимым:

165
Не выводятся данные в админку sleepingowl (laravel)

Не выводятся данные в админку sleepingowl (laravel)

Пробую разобраться в админке sleepingowlГде-то запарился, подскажите что не сделал

201