За последние 24 часа нас посетили 58418 программистов и 1848 роботов. Сейчас ищут 1372 программиста ...

sql inj

Тема в разделе "PHP для новичков", создана пользователем D0Gmatist, 19 июл 2013.

  1. D0Gmatist

    D0Gmatist Активный пользователь

    С нами с:
    3 июн 2012
    Сообщения:
    60
    Симпатии:
    0
    Доброго времени суток.
    Помогите решить задачу с защитой от инъекции.
    Мне стало известно что у меня в строке
    Код (Text):
    1.         $query = mysql_query($q) ;
    Есть уязвимость. =(
    Как можно защититься?
    Помогите пожалуйста, буду при много благодарен. Заранее спасибо!

    Код (Text):
    1. <?PHP
    2.  
    3. //подключение к базе данных
    4. include ("bd.php") ;
    5.  
    6. if (isset($_POST['sound']))
    7.  
    8. // Если поле выбора трека не пустое - закачиваем его на сервер
    9. $sound_dir = "sound/" ; // Директория трека
    10. $sound_name = basename($_FILES['myfile']['name']) ; // Полное имя файла
    11.  
    12.  
    13. // Текст ошибок
    14. $error_by_mysql = "<label class=\"label\">Ошибка при добавлении данных в базу</span>" ;
    15. $error_by_file = "<label class=\"label\">Невозможно загрузить файл в директорию. Возможно её не существует</span>" ;
    16.  
    17.  
    18. // Начало
    19. if(isset($_FILES["myfile"])) {
    20.     $myfile = $_FILES["myfile"]["tmp_name"] ;
    21.     $myfile_name = $_FILES["myfile"]["name"] ;
    22.     $myfile_size = $_FILES["myfile"]["size"] ;
    23.     $myfile_type = $_FILES["myfile"]["type"] ;
    24.     $error_flag = $_FILES["myfile"]["error"] ;
    25.  
    26.     preg_match('/([^-]*) - ([^\.]*)\.(mp3$)/',$sound_name,$mass) ; // вырезаем расширение и разбиваем на артист (-) трек
    27.     $artist = $mass[1] ; // артист
    28.     $track = $mass[2] ; // трек
    29.     $farmat = $mass[3] ; // рсширение mp3 (на всякий случай)
    30.     $farmat = ".".$farmat ;
    31.  
    32.     $allowed_filetypes = array('.mp3'); // Здесь мы перечисляем допустимые типы файлов
    33.  
    34.     if(!in_array($farmat,$allowed_filetypes))
    35.     die('Данный тип файла не поддерживается. Допускаются файлы только с форматом [.mp3]') ;
    36.  
    37.     // создаём имя для дериктории артист
    38.     $artist_dr = str_replace(" ", "_", $artist) ;
    39.     $artist_dr = str_replace("&", "end", $artist_dr) ;
    40.  
    41.     // создаём имя для дериктории трека
    42.     $track_dr = str_replace(" ", "_", $track) ;
    43.     $track_dr = str_replace("&", "end", $track_dr) ;
    44.  
    45.     mkdir("sound/". $artist_dr, 0777);
    46.     mkdir("sound/". $artist_dr ."/". $track_dr, 0777);
    47.  
    48.     $sound_name_sl=str_replace(" ", "_", $sound_name) ; // создаём имя для трека
    49.     $sound_name_sl=str_replace("&", "end", $sound_name_sl) ; // заменяем & на end
    50.  
    51.     $glo_url = "/sound/". $artist_dr ."/". $track_dr ."/". $sound_name_sl ; // заменяем & на end
    52.    
    53.     // Если ошибок не было
    54.     if($error_flag == 0) {
    55.         $DOCUMENT_ROOT = $_SERVER['DOCMENT_ROOT'] ;
    56.         $upfile = getcwd() ."/sound/". $artist_dr ."/". $track_dr ."/". $sound_name_sl ;
    57.        
    58.         if ($_FILES['myfile']['tmp_name']) {
    59.  
    60.             //Если не удалось загрузить файл
    61.             if (!move_uploaded_file($_FILES['myfile']['tmp_name'], $upfile)) {
    62.                 echo "$error_by_file" ;
    63.                 exit ;
    64.             }
    65.  
    66.         } else {
    67.             echo 'Проблема: возможна атака через загрузку файла. ' ;
    68.             echo $_FILES['myfile']['name'] ;
    69.             exit ;
    70.         }
    71.  
    72.         $q = "INSERT INTO fpsd_sound (artist, track, url, size, data) VALUES ('$artist', '$track', '$glo_url', '$myfile_size', NOW())" ;
    73.         $query = mysql_query($q) ;
    74.  
    75.         // Данные успешно внесены в базу данных, выводим сообщение
    76.         if ($query == 'true') {
    77.             echo  "<div class='text'>". $artist ." с треком ". $track ." успешно добавлена на сервер!</div>";
    78.             echo "<div> <a href='add_sound.php' class='add_sound'>ДОБАВИТЬ ЕЩЕ ТРЕК</a> <a href='index.php' class='add_sound'>НА ГЛАВНУЮ</a></div>";
    79.         } else {
    80.             // В противном случае, выводим ошибку при добавлении в базу данных
    81.             echo "$error_by_mysql";
    82.         }
    83.     }
    84.     elseif ($myfile_size == 0) {
    85.     echo "<label class='label'>Трек не выбрана!<br><br>Вернитесь и выберите!</label><br><a href='add_sound.php' class='add_sound'>ВЫБРАТЬ ТРЕК</a>";
    86.     }
    87. }
    88.  
    89. ?>
     
  2. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    пора познакомиться с экранированием - раз.
    перейти на mysqli объект, а не функции - два.
     
  3. D0Gmatist

    D0Gmatist Активный пользователь

    С нами с:
    3 июн 2012
    Сообщения:
    60
    Симпатии:
    0
    Блин ты хоть раз ответишь или всегда только поучаешь!!!
    Ни чего что это раздел для новичков - что говорит о том что я новичок и пока что учусь.
    Лучше бы показал пример экранирования в данной ситуации.. и я бы понял и спасибо сказал...
    А с экранированием я ознакомился mysql_real_escape_string .. да только везде так написано что только гуру разберётся но ему это уже и не надо читать...
    А тупо с доступным языком с примерами в разных видах для новичков нигде ничего нет =(
     
  4. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    только поучаю

    сначала покажи пример, где ты перешел от функций к объекту mysqli.
    примеров с функциями у меня нет.

    написано только одно: применяй экранирование при операциях с данными. Экранируй переменную перед тем как запихать в запрос.

    Добавлено спустя 27 секунд:
    ой ты врунишка
     
  5. D0Gmatist

    D0Gmatist Активный пользователь

    С нами с:
    3 июн 2012
    Сообщения:
    60
    Симпатии:
    0
    Ясно толку от такого раздела для новичков как с быка молока....
     
  6. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    показываю пример использования экранирования с mysqli объетом:
    Код (PHP):
    1. $query = "SELECT * FROM `tbl` WHERE `login` = '".$mysqli->real_escape_string($login)."'"; 
    уловил мысль?