За последние 24 часа нас посетил 17531 программист и 1718 роботов. Сейчас ищут 1800 программистов ...

SQL-инъекции

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

  1. nixx

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

    С нами с:
    20 фев 2013
    Сообщения:
    132
    Симпатии:
    0
    Код (Text):
    1. foreach ($_POST as $key => $value) {
    2.     $_POST[$key] = mysql_real_escape_string($value);
    3.   }
    4.  
    5.   foreach ($_GET as $key => $value) {
    6.     $_GET[$key] = mysql_real_escape_string($value);
    7.   }
    Этот код можно считать универсальным,против SQL-инъекции?
     
  2. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
  3. r3l0c

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

    С нами с:
    10 янв 2013
    Сообщения:
    453
    Симпатии:
    4
    DbSimple +плейсхолдеры. Я полюбил плейсхолдеры в свое время, даже на с++ класс запилил для мускула, чтоб с плейсхолдерами работать =))). Удобно и безопасно
     
  4. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    $_REQUEST, $_COOKIE, $_SERVER тоже содержат произвольные данные от клиента
     
  5. r3l0c

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

    С нами с:
    10 янв 2013
    Сообщения:
    453
    Симпатии:
    4
    +1 бывали случаи, когда через куки инъектом заливали шелл на сайт =)
     
  6. nixx

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

    С нами с:
    20 фев 2013
    Сообщения:
    132
    Симпатии:
    0
    Я имел ввиду для $_POST и $_GET
     
  7. neverlose

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

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    Для обычных SQL Injection, если база данных MySQL, и работать только c $_GET и $_POST - будет достаточно, но существуют ещё и более хитрые методы, под лозунгом Advanced SQL Injection - там уже функция не поможет, там нужна правильная логика обработки данных.

    Приведу небольшой пример:
    Пришла строка в 20 символов: 123456789'1234567890

    Происходит преобразование функцией mysql_real_escape_string
    Получаем строку 123456789\'1234567890

    Пусть у Вас есть функция обрезание строки до 10 символов.
    В результате Вы ожидали получить 123456789', а получили 123456789\ - что в дальнейшем может привести ко взлому.
     
  8. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    не будет =)
    недавно ж мусолили
     
  9. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Просто отсеять все кроме чисел и все и не париться...
     
  10. r3l0c

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

    С нами с:
    10 янв 2013
    Сообщения:
    453
    Симпатии:
    4
    Это редкость, и в основном таким можно воспользоваться имея сорцы, ибо найти такой инъект оч нелегко)

    Добавлено спустя 14 минут 21 секунду:
    Тут числа для примера вроде как), суть не в этом)
     
  11. nixx

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

    С нами с:
    20 фев 2013
    Сообщения:
    132
    Симпатии:
    0
    Тогда получается лучше использовать функции , типа
    Код (Text):
    1. function replacer ($text) {
    2. $text=str_replace(" ",' ',$text);
    3. $text=str_replace(">",'>',$text);
    4. $text=str_replace("<",'&lt;',$text);
    5. $text=str_replace("\"",'&quot;',$text);
    6. $text=preg_replace("/\n\n/",'<p>',$text);
    7. $text=preg_replace("/\n/",'<br>',$text);
    8. ...
    для исключения возможных вариантов инъекций
     
  12. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    а где, в какой теме? мне интересно почитать
     
  13. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    эта функция не имеет отношения у защите от SQL инъекции
     
  14. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    да суть в том что если общение с бд идет через не utf а толи в винде толи в латин1, то при посылке какого-то там утф символа он проходит через эскепинг, но внутре запроса на стороне сервера превращается в кавычку :D

    А где - не помню
     
  15. r3l0c

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

    С нами с:
    10 янв 2013
    Сообщения:
    453
    Симпатии:
    4
    проблема кодировок не только в sql inj выражается). Просто если правильная настройка бд + mysql_real_escape_string 100% ограждают от инъектов).
     
  16. nixx

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

    С нами с:
    20 фев 2013
    Сообщения:
    132
    Симпатии:
    0
    Однозначного лучшего решения видимо не существует.Одни настоятельно советуют эскейпить,в другом месте читаешь
    Код (Text):
    1. Дело в том, что mysql_real_escape_string() не предназначена для защиты от инъекций. Вообще. Это функция, которая нужна для форматирования строк. Причём даже для этой задачи её одной недостаточно - форматирование включает в себя два действия - экранирование и заключение в кавычки.phpfaq.ru
    .К кому податься - к умным или красивым :))
     
  17. r3l0c

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

    С нами с:
    10 янв 2013
    Сообщения:
    453
    Симпатии:
    4
    Просто загуглить "мультибайтовые кодировки sql injection" и будет куча инфы)

    Добавлено спустя 3 минуты:
    Лучшее решение - везде юзать utf-8+экранирование+фильтрация.

    Добавлено спустя 51 секунду:
    хотя экранирование и фильтрацию можно объединить в один термин%).
     
  18. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    тут нет противоречия. экранирование строки нужно, чтобы случайно не вывалиться за кавычки.
    а от инъекций нужна защита от умышленного протыкания дыр в защите.

    просто обычно у всех столько дыр, что искать недокументированные никому не приходится.

    т.е. если вы строки экранируете - то вас если будут ломать, то с умом. А если не экранируете, то вы можете сами себе напортить даже случайно.

    Это как замок на двери.

    Добавлено спустя 47 секунд:
    экрация? фильтрирование?
     
  19. r3l0c

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

    С нами с:
    10 янв 2013
    Сообщения:
    453
    Симпатии:
    4
    Короч можно сказать что в последнее время оно сливается в один термин), тк фильтрация не актуальна, а самый действенный способ--экранирование, но по привычке все-же иногда вылетает птичко, которое не поймаешь, по крайней мере у меня)
     
  20. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    О боже мой! Неужели "экрирование"?

    Добавлено спустя 46 секунд:
    Требуется специалист для улучшения экрации. Фильтристов просьба не беспокоить.
     
  21. r3l0c

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

    С нами с:
    10 янв 2013
    Сообщения:
    453
    Симпатии:
    4
    Ахахах :D Я тебя не понимаю xD

    Добавлено спустя 53 секунды:
    Просто или я дурак?) Может я не так понимаю что такое экранирование, а что такое фильтрация?)
     
  22. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    в мануале написано,что защищает

    Добавлено спустя 4 минуты 22 секунды:
    Экранирование
    [​IMG]
    Фильтрация
    [​IMG]
     
  23. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    таки фильтрирование забыли

    [​IMG]
     
  24. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Вы бы это еще "утрированием" назвали.

    Надежный способ-это тот способ который будет проверяться на равенство, остальное это mysql_real_escape_string().
    nixx, кто такие эти ваши phpfaq.ru.

    Кому вы верите вообще... Вам источник в помощь php.net. Никаких других.

    php.net/manual/ru/function.mysql-real-escape-string.php
    Но-это не значит, что вы должны везде и подрят писать там эту функцию, ибо возможен факт просто на проверку и приведения типа данных...

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

    От всяких XSS если есть вхождение html тегов, пользуйтесь htmlspecialchars для их преобразования в html сущности.

    А увеличивать нагрузку на базу всякими голимыми фильтрами не имеет смысла.
    Это то, что касается базы данных.

    Конечно лучше взять отсеять все не безопасные символы.
    Не изобретайте велосипеды.

    Если вы новичок и очень сильно далеки (не выставляйте свои сайты в публичный доступ, возможен риск атак и взломов, потому, что зачастую начинающие не понимают, что нужно для защиты, как нагородят, понакопируют, понавставляют функций и разных каких-то скриптов непонятно вообще, что и не зная как работает), используйте готовые фреймворки.

    Если чисто для себя тренируетесь, то тут лучше конечно взять и когда пишите проверки и фильтры, то нужно смотреть, что проверяется и вводится, чтобы понять как работает.
     
  25. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    это хорошая иллюстрация к
    какая-та фильтрация может убрать из строки результат экранирования, а экранирование - приписать то, что удалила фильтрация