Защита от sql инъекций

  • Автор темы master09
  • Дата начала
zobow
Участник
Сообщения
17
Реакции
1
  • #21
Спасибо большое ! помогло!
 
Remdev
Участник
Сообщения
77
Реакции
19
  • #22
Научитесь пользоваться этим сканером нормально.
$db->RealEscape - фильтрующая функция в скрипте. По факту обёртка на mysql_real_escape_string.
Нет смысла переменные пропущенные через эту функцию пропускать через mres ещё раз. Это лишь лишний запрос к бд.(Хотя кого это волнует)
 
zobow
Участник
Сообщения
17
Реакции
1
  • #23
помогите пожалуйста с платежным паролем не сохраняется в базе данных когда в настройках его ввожу аккаунта
вот файл config.php в базу хочу чтобы записывался в plat_pass но когда ввожу его выдает сообщение Новый платежный пароль успешно установлен а в базе его нету

<?PHP

$_OPTIMIZATION["title"] = "Аккаунт - Настройки";


$usid = $_SESSION["user_id"];

$db->Query("SELECT * FROM db_users_a WHERE id = '$usid'");

$user_data = $db->FetchArray();

?>

<div id="b3">

<div class="block">

<h2>Настройки</h2>

<center><b>Смена пароля</b></center>

<BR />

<?PHP

if(isset($_POST["old"])){



$old = $func->IsPassword($_POST["old"]);

$new = $func->IsPassword($_POST["new"]);



if($old !== false AND strtolower($old) == strtolower($user_data["pass"])){



if($new !== false){



if( strtolower($new) == strtolower($_POST["re_new"])){



$db->Query("UPDATE db_users_a SET pass = '$new' WHERE id = '$usid'");



echo "<center><font color = 'green'><b>Новый пароль успешно установлен</b></font></center><BR />";



}else echo "<center><font color = 'red'><b>Пароль и повтор пароля не совпадают</b></font></center><BR />";



}else echo "<center><font color = 'red'><b>Новый пароль имеет неверный формат</b></font></center><BR />";



}else echo "<center><font color = 'red'><b>Старый паполь заполнен неверно</b></font></center><BR />";



}

if(isset($_POST["plat_pass"])){



function plat_passs($plat_passs){

if(!preg_match("/^[0-9]{4}$/", $plat_passs)) return false;

return $plat_passs;

}

$plat_passs = plat_passs($_POST["plat_pass"]);

$plat_pass = ($plat_passs);







if($plat_passs !== false){







$db->Query("UPDATE db_users_a SET plat_pass = '".mysql_real_escape_string($plat_pass)."' WHERE id = '$usid'");



echo "<center><font color = 'green'><b>Новый платежный пароль успешно установлен</b></font></center><BR />";







}else echo "<center><font color = 'red'><b>Платежный пароль имеет неверный формат!</b></font></center><BR />";







}

?>



<form action="" method="post">

<table width="330" border="0" align="center">

<tr>

<td><b>Старый пароль:</b></td>

<td align="center"><input type="password" name="old" /></td>

</tr>

<tr>

<td><b>Новый пароль:</b></td>

<td align="center"><input type="password" name="new" /></td>

</tr>

<tr>

<td><b>Повтор пароля:</b></td>

<td align="center"><input type="password" name="re_new" /></td>

</tr>

<tr>

<td align="center" colspan="2"><BR /><input type="submit" value="Сменить пароль" /></td>

</tr>

</table>

</form>

<BR />

Поле Пароль должно иметь от 6 до 20 символов (только англ. символы)

<br>



<?php

if($user_data['plat_pass'] != 0) {

echo '<font color="green">Вы уже установили платежный пароль! Для его смены обратитесь в службу поддержки!</font><br><br>';

} else {

?>

<form action="" method="post">

<table width="330" border="0" align="center">





<tr>

<td><b>Платежный пароль(обязательно):</b></td>

<td align="center"><input type="password" name="plat_pass" /></td>

</tr>

<tr>

<td align="center" colspan="2"><BR /><input type="submit" value="Сменить пароль" /></td>

</tr>

</table>

</form>

<?php } ?>

<font color="red">Платежный пароль должен состоять только из цифр и не длиннее 4-х символов!</font>

</div>

</div>

<div style="clear: both;"></div>

</div>
 
zobow
Участник
Сообщения
17
Реакции
1
  • #24
В обшем нашёл если вот это:
$db->Query("UPDATE db_users_a SET plat_pass = '".mysql_real_escape_string($plat_pass)."' WHERE id = '$usid'");

Меняю вот на это:
$db->Query("UPDATE db_users_a SET plat_pass = '$plat_pass' WHERE id = '$usid'");

то запись в базе данных в db_users_a ->plat_pass появляется
но тогда в файле автоматически появляется дырка SQL Injection )). Может кто знает как это решить? Заранее спасибо!
 
Remdev
Участник
Сообщения
77
Реакции
19
  • #25
zobow написал(а):
В обшем нашёл если вот это:
$db->Query("UPDATE db_users_a SET plat_pass = '".mysql_real_escape_string($plat_pass)."' WHERE id = '$usid'");

Меняю вот на это:
$db->Query("UPDATE db_users_a SET plat_pass = '$plat_pass' WHERE id = '$usid'");

то запись в базе данных в db_users_a ->plat_pass появляется
но тогда в файле автоматически появляется дырка SQL Injection )). Может кто знает как это решить? Заранее спасибо!
$db->Query("UPDATE db_users_a SET plat_pass = '".$db->RealEscape($plat_pass)."' WHERE id = '".intval($usid)."'");

Всё. А если твой анализатор показывает, что в этом месте остаётся sql-inj, но хня полнейшая твой анализатор, выкинь его
 
Последнее редактирование модератором:
zobow
Участник
Сообщения
17
Реакции
1
  • #26
Спасибо большое! сейчас попробую. Я использовал XSS и SQL Injection Сканер http://find-xss.net/scanner/ незнаю насколько он хорош или плох я пока что только учусь! Но все-же спасибо за оперативность!
 
zobow
Участник
Сообщения
17
Реакции
1
  • #27
$db->Query("UPDATE db_users_a SET plat_pass = '".$db->RealEscape($plat_pass)."' WHERE id = '".intval($usid)."'");

SQL Injection! После проверки показало что это тоже инекция. как быть?
 
Remdev
Участник
Сообщения
77
Реакции
19
  • #28
zobow написал(а):
$db->Query("UPDATE db_users_a SET plat_pass = '".$db->RealEscape($plat_pass)."' WHERE id = '".intval($usid)."'");

SQL Injection! После проверки показало что это тоже инекция. как быть?
Выкинуть свой анализатор или научиться им пользоваться
 
zobow
Участник
Сообщения
17
Реакции
1
  • #29
Поставил код проверил запись в бд создалась но теперь выплаты на кошелек не работаю пишет укажите платежный пароль в настройках. я так понял проверка в фале не проходит не подскажите где копать?
вот файл:
<?PHP
$_OPTIMIZATION["title"] = "Заказ выплаты";
$usid = $_SESSION["user_id"];
$usname = $_SESSION["user"];

$db->Query("SELECT * FROM db_users_b WHERE id = '$usid' LIMIT 1");
$user_data = $db->FetchArray();

$db->Query("SELECT * FROM db_users_a WHERE id = '$usid' LIMIT 1");
$user_dataa = $db->FetchArray();



$db->Query("SELECT * FROM db_config WHERE id = '1' LIMIT 1");
$sonfig_site = $db->FetchArray();

$status_array = array( 0 => "Проверяется", 1 => "Выплачивается", 2 => "Отменена", 3 => "Выплачено!!!");

# Минималка серебром! (Тут настраиваем минималку)
$minPay = 10;


?>





<center><a href="/account/payment">Вернутся на страницу Выбора платежной системы</a></center></br>
<b>Выплаты осуществляются в автоматическом режиме на платежную систему PAYEER! Минимальная сумма 10 копеек! Процент при выводе составляет 0%</b> <BR /><BR />
<b>Из платежной системы Payeer Вы можете вывести свои средства в автоматическом режиме на все известные платежные системы и международные банки.</b><BR /><BR />

<center><b>Заказ выплаты:</b></center><BR />

<?PHP
# Заглушка от халявщиков
if($user_data["insert_sum"] <= 0){

?>
<center><font color="blue"><b>Выплату могут заказывать пользователи, которые пополнили баланс больше, чем на 1 RUB!<b></font></center><BR />

</div>
</div>

<div style="clear: both;"></div>
<?PHP

return;
}

?>





<?PHP

function ViewPurse($purse){

if( substr($purse,0,1) != "P" ) return false;
if( !ereg("^[0-9]{7,8}$", substr($purse,1)) ) return false;
return $purse;
}


# Заносим выплату
if(isset($_POST["purse"])){

$purse = $_POST["purse"];
$sum = intval($_POST["sum"]);
$plat_passs = intval($_POST["plat_pass"]);
$plat_pass = md5($plat_passs);
$val = "RUB";
$sum_pay = round( ($sum / $sonfig_site["ser_per_wmr"]), 2);

if($plat_pass == $user_dataa['plat_pass']) {

if($purse !== false){

if($sum >= $minPay){

if($sum <= $user_data["money_p"]){

# Проверяем на существующие заявки
$db->Query("SELECT COUNT(*) FROM db_payment WHERE user_id = '$usid' AND (status = '0' OR status = '1')");
if($db->FetchRow() == 0){


### Делаем выплату ###
$payeer = new rfs_payeer($config->AccountNumber, $config->apiId, $config->apiKey);
if ($payeer->isAuth())
{

$arBalance = $payeer->getBalance();
if($arBalance["auth_error"] == 0)
{

$sum_pay = round( ($sum / $sonfig_site["ser_per_wmr"]), 2);

$balance = $arBalance["balance"]["RUB"]["DOSTUPNO"];
if( ($balance) >= ($sum_pay+100)){



$arTransfer = $payeer->transfer(array(
'curIn' => 'RUB', // счет списания
'sum' => $sum_pay, // сумма получения
'curOut' => 'RUB', // валюта получения
'to' => $purse, // получатель (email)
//'to' => '+71112223344', // получатель ()
//'to' => 'P1000000', // получатель (номер счета)
'comment' => iconv('windows-1251', 'utf-8', "Выплата пользователю {$usname} с проекта Million-rublei.ru")
//'anonim' => 'Y', // анонимный перевод
//'protect' => 'Y', // протекция сделки
//'protectPeriod' => '3', // период протекции (от 1 до 30 дней)
//'protectCode' => '12345', // код протекции
));

if (!empty($arTransfer["historyId"]))
{

# Снимаем с пользователя
$db->Query("UPDATE db_users_b SET money_p = money_p - '$sum',payment_sum = payment_sum + '$sum_pay' WHERE id = '$usid'");

# Вставляем запись в выплаты
$da = time();
$dd = $da + 60*60*24*15;

$ppid = $arTransfer["historyId"];


$db->Query("INSERT INTO db_payment (user, user_id, purse, sum, valuta, serebro, payment_id, date_add, status)
VALUES ('$usname','$usid','$purse','$sum_pay','RUB', '$sum','$ppid','".time()."', '1')");

$db->Query("UPDATE db_stats SET all_payments = all_payments + '$sum_pay' WHERE id = '1'");

echo "<center><font color = 'green'><b>Выплачено!</b></font></center><BR />";
}
else
{

echo "<center><font color = 'red'><b>Сервер выплат перегружен, попробуйте через 10-15 секунд!</b></font></center><BR />";

}


}else echo "<center><font color = 'red'><b>Шлюз перегружен, повторите попытку через 5-10 секунд!</b></font></center><BR />";

}else echo "<center><font color = 'red'><b>Не удалось выплатить! Попробуйте позже</b></font></center><BR />";

}else echo "<center><font color = 'red'><b>Не удалось выплатить! Попробуйте позже</b></font></center><BR />";

}else echo "<center><font color = 'red'><b>У вас имеются необработанные заявки. Дождитесь их выполнения.</b></font></center><BR />";

}else echo "<center><font color = 'red'><b>Вы указали больше, чем имеется на вашем счету</b></font></center><BR />";

}else echo "<center><b><font color = 'red'>Минимальная сумма для выплаты составляет {$minPay} серебра!</font></b></center><BR />";

}else echo "<center><b><font color = 'red'>Кошелек указан неверно! Смотрите образец!</font></b></center><BR />";

}else echo "<center><b><font color = 'red'>Платежный пароль указан не верно!</font></b></center><BR />";
}
?>
<?php
if($user_dataa['plat_pass'] == 0) {
echo "<center><b><font color = 'red'>Укажите платежный пароль в настройках!</font></b></center><BR />";
} else {

?>
<form action="" method="post">
<table width="99%" border="0" align="center">

<td><font color="#000;">Введите кошелек Payeer [Пример: P1112457]</font>: </td>
<?php

IF($sonfig_purse["purse"])
{$pur=$sonfig_purse["purse"];
echo"<td><input type='text' name='purse' size='15' value='".$pur."' readonly='readonly'";
echo"</td>";
}

else echo"<td><input type='text' name='purse' size='15'/> </td>";


?>


<tr>
<td><font color="#000;">Отдаете серебро для вывода</font> [Мин. <?=$minPay; ?>]<font color="#000;">:</font> </td>
<td><input type="text" name="sum" id="sum" value="<?=round($user_data["money_p"]); ?>" size="15" onkeyup="PaymentSum();" /></td>
</tr>
<tr>
<td><font color="#000;">Получаете <span id="res_val"></span></font>[Руб]<font color="#000;">:</font> </td>
<td>
<input type="text" name="res" id="res_sum" value="0" size="15" disabled="disabled"/>
<input type="hidden" name="per" id="RUB" value="<?=$sonfig_site["ser_per_wmr"]; ?>" disabled="disabled"/>
<input type="hidden" name="per" id="min_sum_RUB" value="1" disabled="disabled"/>
<input type="hidden" name="val_type" id="val_type" value="RUB" />
</td>
</tr>
<tr>
<td><font color="#000;">Платежный пароль[указывается в настройках]</font>: </td>
<td><input type="text" name="plat_pass" size="15"/></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" name="swap" value="Заказать выплату" style="height: 30px; margin-top:10px;" /></td>
</tr>
</table>
</form>
<script language="javascript">PaymentSum(); SetVal();</script>


<?php } ?>
<table cellpadding='3' cellspacing='0' border='0' bordercolor='#336633' align='center' width="99%">
<tr>
<td colspan="5" align="center"><h3>Ваши последние выплаты</h3></td>
</tr>
<tr>
<td align="center" class="m-tb">Сумма</td>
<td align="center" class="m-tb">Игрок</td>
<td align="center" class="m-tb">Кошелек</td>
<td align="center" class="m-tb">Дата</td>
<td align="center" class="m-tb">Статус</td>
</tr>
<?PHP

$db->Query("SELECT * FROM db_payment WHERE user_id = '$usid' ORDER BY id DESC LIMIT 20");

if($db->NumRows() > 0){

while($ref = $db->FetchArray()){

?>
<tr class="htt">
<td align="center"><?=$ref["sum"]; ?> RUB</td>
<td align="center"><?=$ref["user"]; ?></td>
<td align="center"><?=$ref["purse"]; ?></td>
<td align="center"><?=date("d.m.Y",$ref["date_add"]); ?></td>
<td align="center"><?=$status_array[$ref["status"]]; ?></td>
</tr>
<?PHP

}

}else echo '<tr><td align="center" colspan="5">Нет записей</td></tr>'

?>



</table>

</div>
</div>

<div style="clear: both;"></div>
 
kvozimir
Участник
Сообщения
1.935
Реакции
409
ICQ
734713 734713
Skype
  • #30
сканер показывает чепуху в плане запроса ,он почти везде предлагает поставить mysql_real_escape_string
 
zobow
Участник
Сообщения
17
Реакции
1
  • #31
так как все таки решить с данным файлом чтобы выплаты заработали? Помогите пожалуйста
 
serega393
Местный
Сообщения
43
Реакции
1
  • #32
zobow написал(а):
так как все таки решить с данным файлом чтобы выплаты заработали? Помогите пожалуйста
зайди в настройки аккаунта или где там у тебя этот пароль записывается и, придумай и сохрани платёжный пароль
 
serega393
Местный
Сообщения
43
Реакции
1
  • #33
и если платежный пароль не число то это $plat_passs = intval($_POST["plat_pass"]); замени на $plat_passs = $_POST["plat_pass"];
 
kvozimir
Участник
Сообщения
1.935
Реакции
409
ICQ
734713 734713
Skype
  • #34
serega393 написал(а):
и если платежный пароль не число то это $plat_passs = intval($_POST["plat_pass"]); замени на $plat_passs = $_POST["plat_pass"];
и сделай инъекцию для взлома)пусть хотя бы фильтрацию ставит
 
serega393
Местный
Сообщения
43
Реакции
1
  • #35
kvozimir написал(а):
и сделай инъекцию для взлома)пусть хотя бы фильтрацию ставит
а при чем тут инъекции, мы же не заносим эти данные в БД ))))))))) вы хотя бы код глянули прежде чем комментировать...
 
TyTuKeT
Участник
Сообщения
219
Реакции
37
  • #36
Не проще пару фильтров использовать чем придумывать танцы с бубнами?
Как пример:
PHP:
$user = strip_tags($_POST['user']);
$user = htmlspecialchars($user);
$user = mysql_escape_string($user);
$user = trim($user);
 
Remdev
Участник
Сообщения
77
Реакции
19
  • #37
TyTuKeT написал(а):
Не проще пару фильтров использовать чем придумывать танцы с бубнами?
Как пример:
PHP:
$user = strip_tags($_POST['user']);
$user = htmlspecialchars($user);
$user = mysql_escape_string($user);
$user = trim($user);
Если использовать это одновременно - то это точно танцы с бубном)
 
TyTuKeT
Участник
Сообщения
219
Реакции
37
  • #38
Remdev написал(а):
Если использовать это одновременно - то это точно танцы с бубном)
Я как пример привел. Новичкам не понимающим что от куда лучше пачкой и использовать проблем и вопросов будет меньше.
 
Сверху