goodier

goodier
Рейтинг
36
Регистрация
10.03.2009

iopiop Этот человек и до того как я добавил SLEEP() умудрялся снимать двойную сумму

Я отправил Вам файл в личку!

Ragnarok:
что если юзер зарегается с ником "vas%"?

При регистрации я проверяю - preg_match("/^[a-zA-Z0-9]{4,}$/",$login)

Я отредактировал все файлы в которых писал запрос с LIKE но уверен дело не в этом

Ragnarok:
$summa=$abs((int)$summa);

Я не могу использовать (INT) так как пользователь может снять сумму дробную сумму с точкой

и поэтому использую $summa = floatval($summa);

Что значит переменная $abs ???

iopiop:
я вам уже предложил подумать, что будет если у вас есть пользователи vasya1, vasya2, vasya3 и vas%. Что вернет проверка баланса с вашим любимым like для пользователя vas% ? для какого реально пользователя будет возвращен баланс? я вот не знаю. и скажу вам по секрету, никто не знает.

В моем примере нет текста в запросе WHERE `login` LIKE '".$login."%'" я не использую знак %

ТИП колонки с балансом=varchar

Кодировка=utf8_general_ci

iopiop:

другой вариант - что происходит если сумма передается в этот код отрицательная? я не знаю, т.к. код не полный.

убираю все заменой

$summa = str_replace("-","", $summa);
$summa = str_replace("+","", $summa);
$summa = str_replace("`","", $summa);
$summa = str_replace("'","", $summa);
$summa = str_replace('"','', $summa);

iopiop:

третий вариант событий. предположим пришел запрос, начинает выполняться, прошел проверку if($summa > balance($login)) и в этот момент приходит второй запрос. первый запрос перестает выполняться, выполняется второй запрос, выполнился полностью и процессор вернулся к выполнению первого запроса. заметьте, проверка баланса в первом запросе уже прошла, и прошла удачно, о том что деньги сняты вторым запросом, первый запрос ничего не знает.
кстати именно во время sleep и происходит переключение контекста.

Первый запрос проходит проверку if($summa > balance($login)) и это условие не срабатывает так как баланс еще тот же и сразу после проверки в условии с баланса снимается сумма.

Второй запрос уже не должен пройти так как условии должно сработать ведь в функции проверяется баланс а не где то выше условия из БД.

Пишу все в фал типа login.txt и в нем нет ничего лишнего , а только то что должно придти.

LEOnidUKG:
goodier, у вас всё это на локалке или где-то на фтп уже лежит? Если так, скиньте в личку доступ, я посмотрю на эти чудеса, как там отправляется два раза данные.

у меня все это работает на сервере и доступ дать не могу, так как работаю с деньгами.

RoMaN444Ik,

Мой код который я привел в примере обрезан.

В нем нет функций sleep(2) и mysql_escape_string($_post[blablabla])

Я в этой теме прошу помочь мне с решением проблемы без оплаты за помощь.

и думаю эта тема в будущем пригодится людям.

---------- Добавлено в 17:58 ---------- Предыдущее сообщение было в 17:46 ----------

ну как так получается если баланс в первом его запросе на выплату уже равен 0

а во втором запросе проверилось в условии и закончило все функцией EXIT();

$login = // логин из сессии

$balance = // Селект баланса из таблицы юзеров

$summa = $mysql_escape_string($_post['summa']);

if($balance <= 0){ exit("Недостаточно средств!"); } // не исполнять ниже код

if($summa > balance($login)){ exit("Недостаточно средств!"); } // не исполнять ниже код

mysql_query("UPDATE `USERS_table` SET balance=balance-".$summa." WHERE `login` LIKE '".$login."'");

/* подготавливаю POST данные для передачи через CURL */

$_POST['username'] = $login;

$_POST['viplata'] = $summa; и тд..

$state = pay($_POST); /* и отдаю на другой сервер где подключены XML интерфейсы WEBMONEY */

if($state==0){

mysql_query("UPDATE `PAY_table` SET `state`='1' WHERE `id`=".$order_id);

exit("Счет обработан, Деньги выплачены!"); // не исполнять ниже код

} else {

mysql_query("UPDATE `USERS_table` SET balance=balance+".$summa." WHERE `login` LIKE '".$login."'");

mysql_query("UPDATE `PAY_table` SET `state`='2' WHERE `id`=".$order_id);

}

У меня такая мысля в голове есть!

Может этот пользователь написать программу которая будет на разных машинах запускаться в одно и то же время и в программе будут передаваться ПОСТ параметры в мой файл обработчик, но тут опять же голову ломаю как тогда мой обработчик понимает его логин и другие данные которые хранятся в сессии на моем сервере.

Я все $_post обрабатываю через mysql_escape_string($_post[blablabla])

и на сервере отключен регистр глобал.

Согласен, что можно было преобразовать все текстовые данные в нижний регистр и писать where login='blablabla' но реч идет не об этом, атом, что в фал обработчик приходит сразу два обращения в одно и тоже время которые каким то образом умудряются выполнится.

И если взять совет от dkameleon, то получится опять тоже самое!

Этот умный пользователь сделает такие же 2 запроса и баланс станет минусовым и в таблицу с заявками на выплату добавится 2 запроса и когда через CRON

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

У кого какие мысли, помогите найти решение этой серьезной проблемы.

iopiop,

Использую конструкцию WHERE login LIKE $login потому, что пользователь один и тодже вводит свой логин маленькими и иногда большими буквами.

palladin_jedi,

Покажите дырки в моем примере пожалуйста.

Какое решение есть для запрета выполнения запросов в БД?

---------- Добавлено в 03:02 ---------- Предыдущее сообщение было в 03:01 ----------

Просто походу MySQL сервер тут не причем раз создаются два запроса в микросекундах

Ragnarok,

Да хрен с ними с данными в MySQL главное чтоб с моего WMR-кошелька не отнималось двойная сумма ))))

---------- Добавлено в 02:36 ---------- Предыдущее сообщение было в 02:35 ----------

palladin_jedi,

<?

function balance($l){
$r = mysql_fetch_row(mysql_query("SELECT `balance` FROM `USERS_table` WHERE `login` LIKE '".$l."'"));
return $r[0];
}
?>
Всего: 78