За последние 24 часа нас посетили 50930 программистов и 1753 робота. Сейчас ищут 878 программистов ...

SQL инъекция, что делать?

Тема в разделе "PHP для новичков", создана пользователем Андрей12, 16 апр 2015.

  1. Андрей12

    Андрей12 Новичок

    С нами с:
    18 фев 2015
    Сообщения:
    131
    Симпатии:
    0
    Код (Text):
    1.        <?
    2. if(!isset($_SESSION['id']) and !isset($_SESSION['login'])) {
    3.  
    4. print "<html>
    5. <head>
    6. <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">
    7.  
    8. <script language=\"javascript\">top.location.href=\"/\";</script>
    9. <title>Перенаправление</title>
    10. </head>
    11. <body bgcolor=\"#eeeeee\" topmargin=\"0\" leftmargin=\"0\">
    12.  
    13. </body>
    14. </html>";
    15. exit;
    16. }
    17. $page = 'Обмен средств';
    18. if(isset($_POST['amount'])) {
    19. $sum = sf($_POST['amount']);            // что то тут надо сделать,а что понять не могу.
    20. $date = time();
    21. if($sum > 0) {
    22. if($us_data['money_out'] >= $sum) {
    23. mysql_query("UPDATE tb_users SET money_out = money_out - '$sum', money = money + '$sum' WHERE id = '$usid'") or die(mysql_error());
    24. mysql_query("INSERT INTO tb_history (user_id, summa, date, comment, type) VALUES ('$usid', '$sum', '$date', 'Обмен средств на сумму $sum', 'convert')") or die(mysql_error());
    25. echo '<center><font color="green">Вы успешно обменяли средства</font></center><br>';
    26. }else echo '<center><font color="red">Не достаточно средств на балансе</font></center><br>';
    27.  
    28. }else echo '<center><font color="red">Не верная сумма</font></center><br>';
    29. }
    30. ?>
    31.  
    32. <p>
    33.         Обменять денежные средства с баланса для вывода на баланс для оплаты.<br>
    34.         Комиссия системы за обмен составляет <b>0%</b>.<br>
    35.        
    36.         </p>
    37.  
    38.         <form method="post" action="">
    39.             <label title="Для добавления всей суммы, нажмите на цифры!" onclick= this.form.elements["amount"].value=<?=$us_data['money_out']; ?>>Сумма (Доступно: <span ><?=$us_data['money_out']; ?></span> руб)</label>
    40.             <input type="text" size="15" value="" maxlength="7" name="amount">
    41.            
    42.             <label></label>
    43.             <input class="buttonmail" value="Обменять" type="submit" />
    44.  
    45.         </form>
    46.  
    47.         <div id="formsgifts" style="display: none"></div>          
    хочу убрать баг,когда человек вводит вот такое число +100' то ему зачисляются средства,как сделать проверку?
    вот здесь что то не так - $sum = sf($_POST['amount']);
     
  2. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Погорел? это называется SQL инъекция, ищи в интернете информации много.

    PS в твоем коде надо много что менять, начиная от mysql_query, это устаревшая функция(функции), надо использовать те что mysqli_ и там собственно есть экранирование запросов, это как раз то, что решит твою проблему.

    Добавлено спустя 4 минуты 13 секунд:
    ну или попробуй вот такую хрень:
    Код (PHP):
    1.  $sum = mysql_escape_string( sf($_POST['amount']) ); 
     
  3. Андрей12

    Андрей12 Новичок

    С нами с:
    18 фев 2015
    Сообщения:
    131
    Симпатии:
    0
    спасибо за ответ,а вот так не получится? $amount = $_POST['amount'];
    $sum = $amount; вроде все нормально,но пишет ошибку вот такую: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use nea типо что то не поддерживает)





    $sum = mysql_escape_string( sf($_POST['amount']) ); то что вы кинули<не канает)
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Re: помогите решить.

    1. синтаксис ломается поэтому вопрос не выполняется. внимательно при составлении запроса к субд
    2. эскейп тут правильно посоветован. неправильно применен.
     
  5. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Re: помогите решить.

    А что конкретно не так применяется? $sum экранируется и в дальнейшем в запросе используется только $sum

    Добавлено спустя 29 секунд:
    Ну если не брать в учет что весь этот не правильный и убогий.
     
  6. Андрей12

    Андрей12 Новичок

    С нами с:
    18 фев 2015
    Сообщения:
    131
    Симпатии:
    0
    Re: помогите решить.

    не понял,а как его правильно применить? намекните пожалуйста,или покажите пример)спасибо)

    <?php
    $item = "Zak's and Derick's Laptop";
    $escaped_item = mysql_real_escape_string($item);
    printf ("Escaped string: %s\n", $escaped_item);
    ?>

    типо такого?

    Добавлено спустя 52 минуты 59 секунд:
    помогите пожалуйста:) я все перепробовал )) пожалуйста) спасибо. $sum = $us_data['money_out']; если сделать так то будет четко работать все,но деньги все переводятся на баланс оплаты,а надо чтоб человек сам указал сколько ему надо) попробовал так: $sum = mysql_escape_string( sf($_POST['amount']) ); все равно баланс в минус уходит..
     
  7. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Re: помогите решить.

    релакс. подразумевалось что человек запихнул твой совет методом высоконаучного тыка не особо вдумываясь в правильность алгоритма. о тебе уже сказано что ты посоветовал правильно.
     
  8. Андрей12

    Андрей12 Новичок

    С нами с:
    18 фев 2015
    Сообщения:
    131
    Симпатии:
    0
    Re: помогите решить.

    Извините,пойду думать.. если получится.. :)
     
  9. Андрей12

    Андрей12 Новичок

    С нами с:
    18 фев 2015
    Сообщения:
    131
    Симпатии:
    0
    Re: помогите решить.

    вот теперь я точно везде, куда только можно впихивал,а толку 0... может проблема не в этом)? (конечно вы лучше знаете<но блин я тупой значит) либо я вообще не то делаю что надо((


    Код (Text):
    1.   $page = 'Обмен средств';
    2. if(isset($_POST['amount'])) {
    3.      
    4.   $sum = mysql_escape_string( sf($_POST['amount']) );    // остановился на этом,ну уже реально не куда впихивать)
    5.  
    6.  
    7.    
    8.  
    9. $date = time();
    10. if($sum > 0) {
    11.    
    12. if($us_data['money_out'] >= $sum) {
    13.  
    14. mysql_query("UPDATE tb_users SET money_out = money_out - '$sum', money = money + '$sum' WHERE id = '$usid'") or die(mysql_error());
    15. mysql_query("INSERT INTO tb_history (user_id, summa, date, comment, type) VALUES ('$usid', '$sum', '$date', 'Обмен средств на сумму $sum', 'convert')") or die(mysql_error());
    16. echo '<center><font color="green">Вы успешно обменяли средства</font></center><br>';
    17. }else echo '<center><font color="red">Не достаточно средств на балансе</font></center><br>';
    18.  
    19. }else echo '<center><font color="red">Не верная сумма</font></center><br>';
    20. }
    21.          
     
  10. iNEEdhLw

    iNEEdhLw Новичок

    С нами с:
    22 окт 2014
    Сообщения:
    414
    Симпатии:
    0
    Re: помогите решить.

    обрамляй код через
    Код ( (Unknown Language)):
    1. [b][size=7]php[/size][/b][/color]]
    , так лучше читается )
     
  11. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Re: помогите решить.

    А что конкретно не так? какая ошибка.
     
  12. Андрей12

    Андрей12 Новичок

    С нами с:
    18 фев 2015
    Сообщения:
    131
    Симпатии:
    0
    Re: помогите решить.

    никакая в том то и дело) допустим я с баланса для вывода решил обменять на оплату но денег нету на балансе для вывода и я напишу обменят допустим вот так: +100'''''''''''''' или +100ээээ то баланс для вывода уйдет в минус,а мне надо чтоб он ошибку писал типо денег нету на балнсе для вывода вы не сможете обменять...

    Добавлено спустя 1 минуту 23 секунды:
    а если я вместо +100эээ напишу -100эээ то вызывает ошибку... Не верная сумма а если я поставлю код вот такой
    Код (Text):
    1.     $page = 'Обмен средств';
    2. if(isset($_POST['amount'])) {
    3.      
    4.  $sum = $us_data['money_out'];
    5.  
    6.    
    7.  
    8. $date = time();      
    то хоть +100ээ хоть -100эээ пиши все равно вызывает ошибку,но он обменивает ВСЕ деньги которые есть на балансе для вывода,а мне надо чтоб человек указывал сколько ему надо...
     
  13. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Re: помогите решить.

    Ну все правильно, ты же только проверяешь существует ли переменная, а что там '100' или '100эээ', на это проверка не идет, сделай ее, поменяй вот эту часть:
    Код (Text):
    1. if($sum > 0)
    на (сначала проверяешь число ли ввел пользователь и потом только больше оно нуля или нет)
    Код (Text):
    1. if(is_int($sum) AND $sum > 0)

    и смотри, на этой же строчке идет знак "{", не забудь его, а то опять потом будет...
     
  14. Андрей12

    Андрей12 Новичок

    С нами с:
    18 фев 2015
    Сообщения:
    131
    Симпатии:
    0
    Re: помогите решить.

    Код (Text):
    1.      $page = 'Обмен средств';
    2. if(isset($_POST['amount'])) {
    3.      
    4.  
    5.  
    6.      $sum = mysql_escape_string( sf($_POST['amount']) );
    7.      
    8.  
    9.  
    10. $date = time();
    11. if(is_int($sum) AND $sum >= 0) {
    12. echo $sum;
    13.    
    14. if($us_data['money_out'] >= $sum) {
    15.      
    16.  
    17. mysql_query("UPDATE tb_users SET money_out = money_out - '$sum', money = money + '$sum' WHERE id = '$usid'") or die(mysql_error());
    18. mysql_query("INSERT INTO tb_history (user_id, summa, date, comment, type) VALUES ('$usid', '$sum', '$date', 'Обмен средств на сумму $sum', 'convert')") or die(mysql_error());
    19. echo '<center><font color="green">Вы успешно обменяли средства</font></center><br>';
    20. }else echo '<center><font color="red">Не достаточно средств на балансе</font></center><br>';
    21.  
    22. }else echo '<center><font color="red">Не верная сумма</font></center><br>';
    23. }
    24. ?>        
    щас при любом раскладе выводит ошибку(
     
  15. mr.akv

    mr.akv Активный пользователь

    С нами с:
    31 мар 2015
    Сообщения:
    1.604
    Симпатии:
    206
    Re: помогите решить.

    is_int() в чистом виде не прокатит. Вы вводите +100, а это ни разу не число, это строка.
    Сначала разбейте строку на + и на число, а потом уже проверяйте.
     
  16. Андрей12

    Андрей12 Новичок

    С нами с:
    18 фев 2015
    Сообщения:
    131
    Симпатии:
    0
    Re: помогите решить.

    жаль что тут смайлов нету=) примерчик можно,как это все сделать)?

    Добавлено спустя 2 минуты 21 секунду:
    Кстати если поменять знак у
    Код (Text):
    1.  if(is_int($sum) AND $sum >= 0)  
    на
    Код (Text):
    1.    if(is_int($sum) AND $sum =< 0)      
    то +100э не проканает,но зато проканает -100э (
     
  17. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Re: помогите решить.

    Ты РНР вообще не знаешь или как?

    Просто по хорошему тут надо что бы $sum была чисто числом, а вот + или -, это должно быть отдельное поле - выпадающий список.
     
  18. mr.akv

    mr.akv Активный пользователь

    С нами с:
    31 мар 2015
    Сообщения:
    1.604
    Симпатии:
    206
    Re: помогите решить.

    С чего бы условие =< работало? Оно должно вывести синтаксическую ошибку.
     
  19. Андрей12

    Андрей12 Новичок

    С нами с:
    18 фев 2015
    Сообщения:
    131
    Симпатии:
    0
    Re: помогите решить.

    я наверное знаками ошибся но я сделал наоборот и работало в противоположном направлении)
     
  20. Андрей12

    Андрей12 Новичок

    С нами с:
    18 фев 2015
    Сообщения:
    131
    Симпатии:
    0
    Re: помогите решить.

    Код (Text):
    1.           <?
    2. if(!isset($_SESSION['id']) and !isset($_SESSION['login'])) {
    3.  
    4. print "<html>
    5. <head>
    6. <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">
    7.  
    8. <script language=\"javascript\">top.location.href=\"/\";</script>
    9. <title>Перенаправление</title>
    10. </head>
    11. <body bgcolor=\"#eeeeee\" topmargin=\"0\" leftmargin=\"0\">
    12.  
    13. </body>
    14. </html>";
    15. exit;
    16. }
    17. $page = 'Обмен средств';
    18.  
    19. echo '== Алфавит ==' . PHP_EOL;
    20. $s = 'W';
    21. $sa = sf($_POST['amount']);  
    22. $a = $s + $sa;
    23. for ($n=0; $n<6; $n++) {
    24.     echo ++$s . PHP_EOL;
    25. }
    26. // Цифры ведут себя по другому
    27. echo '== Цифры ==' . PHP_EOL;
    28. $d = 'A8';
    29. for ($n=0; $n<6; $n++) {
    30.     echo ++$d . PHP_EOL;
    31. }
    32. $d = 'A08';
    33. for ($n=0; $n<6; $n++) {
    34.     echo ++$d . PHP_EOL;
    35. }
    36.  
    37.  
    38. if(isset($_POST['amount'])) {
    39. $sum = sf($_POST['amount']);            // что то тут надо сделать,а что понять не могу.
    40. $date = time();
    41. if($sum > 0) {
    42.     if($sum = $a) {
    43. if($us_data['money_out'] >= $sum) {
    44. mysql_query("UPDATE tb_users SET money_out = money_out - '$sum', money = money + '$sum' WHERE id = '$usid'") or die(mysql_error());
    45. mysql_query("INSERT INTO tb_history (user_id, summa, date, comment, type) VALUES ('$usid', '$sum', '$date', 'Обмен средств на сумму $sum', 'convert')") or die(mysql_error());
    46. echo '<center><font color="green">Вы успешно обменяли средства</font></center><br>';
    47. }else echo '<center><font color="red">Не достаточно средств на балансе</font></center><br>';
    48. }else echo '<center><font color="red">Не верная сумма</font></center><br>';
    49. }else echo '<center><font color="red">Не верная сумма</font></center><br>';
    50. }
    51. ?>
    52.  
    53.                        



    я вроде бы сделал, так можно делать?
     
  21. rodent90

    rodent90 Новичок

    С нами с:
    26 мар 2015
    Сообщения:
    533
    Симпатии:
    37
    Если это число, то эскейп тут нахер не нужен.
    Обычнное приведение к числу будет гуманнее.
     
  22. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    А я против приведения к числу. Куда-то улетит запрос по нулевому айдишнику.
    Лучше просто проверять иснумериком, число это или нет.