Помощь

бонус рефереру от пополнения

40 13
user avatar
Пользователь
На сайте 15 лет
Сообщений : 71
Репутация : 0
7 лет назад
Всем привет. Делаю на основе старого доброго суфаста игру.

Вот интересует вопрос, как сделать, чтобы при пополнении рефереру шли рефские за пополнение? Платежная система payeer.

Файл обработчик прикрепил.

 
user avatar
Пользователь
На сайте 15 лет
Сообщений : 663
Репутация : 0
7 лет назад
Пункт 1.

20-ая строка скрипта:

$sum=$_POST['m_amount']; //Сумма, поступившая от клиента

делаешь ниже новую строку и добавляешь:

$bonus=$sum*0.05;
$refbonus=round($bonus, 2);


Тут высчитываешь рефереру бонус в процентах. Сумму пополнения умножаем на нужный процент(5%=0.05 10%=0.1). Измени под себя. Вторая строка - округляем полученный бонус до двух цифр после запятой(из 1.2449 получится 1.24, из 1.2450 получится 1.25)

 

Пункт 2.

Потом у тебя идут уже такие строки (31 и 32 в оригинале):

$sql="update tb_users set money=money+'$sum' where username='$user'";
mysql_query($sql);


Ниже делаешь пару новых строк отступа и вставляешь:

$sql=mysql_query("select referer from tb_users where username='$user'");
$ref=mysql_fetch_assoc($sql);
$referer=$ref["referer"];
mysql_query("update tb_users set money=money+'$refbonus' where username='$referer'");

Обрати внимание на первой строке в запросе выделил referer, тебе нужно посмотреть как у тебя называется в базе поле в котором хранится реферер юзера и подставить его.

 

Пункт 3.

И ещё ниже у тебя видимо статистика пишется какая сумма вообще в проекте, сюда тоже надо подписать процент который подарил рефереру. После вот таких строк(37 и 38 в оригинале):

$sql="UPDATE tb_config SET rezerv=rezerv+'$sum' WHERE id = '1'";
mysql_query($sql);

Добавляешь вот этот код:

mysql_query("UPDATE tb_config SET rezerv=rezerv+'$refbonus' WHERE id = '1'");

 

Пункт 4.

Хоть вроде визуально в скрипт не подкопаться с подменой данных даже зная ключ и адрес скрипта(проверяется общая подпись). Меня как то коробит от того что $_POST-ы у тебя в чистом виде летят в базу. Я бы что нибудь вот такое в первые строки скрипта добавил:

if (!is_numeric($id) && !is_numeric($sum) && $sum
user avatar
Пользователь
На сайте 15 лет
Сообщений : 71
Репутация : 0
7 лет назад
Спасибо за ответ!

И какие ещё данные лучше фильтровать и каким образом?
user avatar
Администратор
На сайте 15 лет
Сообщений : 276
Репутация : 120
7 лет назад

Цитата: reklamawmb от 30.12.2018, 23:26
Спасибо за ответ!

И какие ещё данные лучше фильтровать и каким образом?

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

А лучше использовать подготовленные запросы и проблема с инъекциями отпадает. Но и все равно это не стоит пускать на самотек и все же фильтровать данные.

По поводу твоего обработчика: еще сравнивай суммы, валюту и проверяй ID платежа на уже исполненный платеж.
user avatar
Пользователь
На сайте 15 лет
Сообщений : 71
Репутация : 0
7 лет назад

Цитата: WmRush от 31.12.2018, 16:15

Цитата: reklamawmb от 30.12.2018, 23:26
Спасибо за ответ!

И какие ещё данные лучше фильтровать и каким образом?

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

А лучше использовать подготовленные запросы и проблема с инъекциями отпадает. Но и все равно это не стоит пускать на самотек и все же фильтровать данные.

По поводу твоего обработчика: еще сравнивай суммы, валюту и проверяй ID платежа на уже исполненный платеж.

Сравнивать как steam написал?? В 4 пункте.
user avatar
Администратор
На сайте 15 лет
Сообщений : 276
Репутация : 120
7 лет назад

Цитата: reklamawmb от 01.01.2019, 01:12

Цитата: WmRush от 31.12.2018, 16:15

Цитата: reklamawmb от 30.12.2018, 23:26
Спасибо за ответ!

И какие ещё данные лучше фильтровать и каким образом?

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

А лучше использовать подготовленные запросы и проблема с инъекциями отпадает. Но и все равно это не стоит пускать на самотек и все же фильтровать данные.

По поводу твоего обработчика: еще сравнивай суммы, валюту и проверяй ID платежа на уже исполненный платеж.

Сравнивать как steam написал?? В 4 пункте.

Примерно вот так. Под себя подпилишь)

if($row['amount'] < $_POST['m_amount'])
exit("Не верная сумма");
if($_POST['m_curr'] != "RUB")
exit("Не верная валюта");
if($row['status'] != 0)
exit("Счет уже был оплачен");


 
user avatar
Пользователь
На сайте 15 лет
Сообщений : 71
Репутация : 0
7 лет назад

Цитата: steam от 30.12.2018, 06:14

Все сделал, вроде как работает. + дописал еще немного. Начал понемногу вникать в php.  Оставил много-много комментариев в файле.

Перезалил файл, есть еще замечания какие? твою проверку сделал.  Сижу вот и думаю, как остальные $_POST проверить.

Цитата: WmRush от 01.01.2019, 13:00
Примерно вот так. Под себя подпилишь)

И после чего и где это вставлять?
user avatar
Пользователь
На сайте 15 лет
Сообщений : 663
Репутация : 0
7 лет назад
WmRush, у него там генерируется подпись и сравнивается что пришло и что в базе, фактически там не подкопаться никак из-за того что в начале всего этого POST-ы шифруются(даже если подкинуть левого кода через post то он зашифруется и не выполнится) и сравниваются на совпадение, при том у себя в базе он формирует сам. Там тяжело подкопаться к этому. Только если подписи совпадают уже дальше платёж идёт, извлекаются суммы из POST-ов
user avatar
Пользователь
На сайте 15 лет
Сообщений : 71
Репутация : 0
7 лет назад
А как можно попытаться подменить значение?
user avatar
Пользователь
На сайте 15 лет
Сообщений : 71
Репутация : 0
7 лет назад

Цитата: steam от 01.01.2019, 21:12
WmRush, у него там генерируется подпись и сравнивается что пришло и что в базе, фактически там не подкопаться никак из-за того что в начале всего этого POST-ы шифруются(даже если подкинуть левого кода через post то он зашифруется и не выполнится) и сравниваются на совпадение, при том у себя в базе он формирует сам. Там тяжело подкопаться к этому. Только если подписи совпадают уже дальше платёж идёт, извлекаются суммы из POST-ов

Я вот нажал пополнить баланс на 1 рубль, навел на кнопку, нажал просмотреть код, в значении



изменил 1.00 на 100, и нажал оплатить, вылезло окошко Неверная подпись m_sign

и в браузере была строчка m_orderid=11044000&m_amount=100.00&m_curr=RUB
user avatar
Пользователь
На сайте 15 лет
Сообщений : 663
Репутация : 0
7 лет назад
reklamawmb, ну файл заказа ты нам не показывал. У тебя там ещё ключ проверяется. Вопрос что можно сделать через заказ, но через оплату саму - адрес принимающего POST-ы файла знает только платёжка, плюс там ключ ещё раз повторюсь, который нужно знать для взлома.
user avatar
Пользователь
На сайте 15 лет
Сообщений : 71
Репутация : 0
7 лет назад
Прикрепил файл, теперь вроде как кроме цифр и точки нечего не лезет в строку пополнения баланса, посмотрите. Какие еще будут замечания?
user avatar
Пользователь
На сайте 15 лет
Сообщений : 663
Репутация : 0
7 лет назад
Вроде бы всё хорошо
Автор темы
author avatar
reklamawmb
Пользователь
На сайте 15 лет
Сообщений 71
Тем 5
Репутация 0
Теги темы
Автор не добавил тегов для этой темы
Ответить
Написал(а):