За последние 24 часа нас посетил 17581 программист и 1716 роботов. Сейчас ищет 1831 программист ...

Защита от MYSQL иньекций

Тема в разделе "PHP для новичков", создана пользователем Колбася, 11 ноя 2012.

  1. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну тогда выходит что ты капец бол, ибо доказательство тезиса целиком лежит на плечах постулирующего.
     
  2. Gold Dragon

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

    С нами с:
    30 сен 2012
    Сообщения:
    306
    Симпатии:
    2
    Адрес:
    Тамбов
    сам ты матерное слово...
    Читай всю тему, а не выдёргивай слова из контента. Пример я привёл, mysql_escape_string не панацея, инъекция прошла. А то что в кавычки нужно всё ставить - это уже вопрос третий. Я лично не ставлю кавычки, а просто прогоняю через intval()
    И тем более mysql_escape_string не всегда применима
     
  3. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    не привёл.
    случай, когда в запрос вставляются данные без кавычек или без риалэскепа давайте не рассматривать.
     
  4. Gold Dragon

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

    С нами с:
    30 сен 2012
    Сообщения:
    306
    Симпатии:
    2
    Адрес:
    Тамбов
    это ещё почему, что это за дополнительные условия? Основная мысль - достаточно ли mysql_escape_string чтобы избавиться от инъекции. Ответ - нет. Нужна ещё голова и знания как правильно её применять
    :)

    Добавлено спустя 1 минуту 45 секунд:
    в общем в любом случае это уже морально устаревшая "защита" ))
     
  5. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Gold Dragon, ты о типизации?

    mysql_escape_string - deprecated.

    mysql_real_escape_string - предостережет, mysql_set_charset чтобы влиять на поведение.

    А вообще mysql_* уже - deprecated.

    В дальнейшем подвергнется удалению, вскорей всего.
     
  6. Gold Dragon

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

    С нами с:
    30 сен 2012
    Сообщения:
    306
    Симпатии:
    2
    Адрес:
    Тамбов
    типа того
     
  7. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Слив защитан чо =)
    но в принципе я с тобой согласен.
     
  8. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Код (PHP):
    1. mysql_query("SELECT `login`,`password` FROM `user` WHERE `id`='".intval(preg_replace('/[^0-9]/','',$_POST['id']))."' LIMIT 0,1"); 
     
  9. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    хватит и просто intval()
    причем делать это ДО запроса. и если результат равен нулю - то даже и запрос делать не нужно
     
  10. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    прием универсальнее
    Код (Text):
    1. $var == (int)$var
     
  11. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Код (PHP):
    1. $a='a4543';
    2. echo intval($a); // 0
    3.  
    4. $a='2a4543';
    5. echo intval($a); // 2
    6.  
    7. $a='2a4543';
    8. echo intval(preg_replace('/[^0-9]/','',$a)); //24543  
     
  12. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    Your, тут вопрос в другом.
    если я жду число а мне пришло какоето говно - то это явная ошибка или хакер начинающий чтото подбирает.
    какой смысл копаться в этом говне и выдавать абы какой результат нагружая БД бессмысленными запросами?

    все просто. если входные данные не соответсвуют тому что мы ожидаем - это исключительная ситуация. надо сообщать об этом юзеру и админу. и прекращать работу скрипта. точка!
     
  13. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    не факт
     
  14. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    например?
     
  15. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Косяки разрабов, не отслеженные на этапе разработки и тестирования.
     
  16. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    Косяки разрабов = ошибки. об этом я и написал
     
  17. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Люто плюсую !!!

    Бесят всякие "джедайские техники" типа intval или того хуже strip_tags и прочие "шедевры"
     
  18. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
  19. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    от интвала ты всё равно не уйдёшь. Где-то он будет =)
     
  20. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Зачем уходить от приведения типов?
     
  21. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    хз.
    кто-то видит свою задачу в полном анальном огораживании. Я вижу задачу только не допустить несанкционированного изменения БД.
     
  22. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Анальная кара :D
     
  23. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Давно ушёл, и не жалею.

    С этим просто справляется Ctype или (если нужны отрицательные значения) тупо is_numeric.

    Попробуй несанкционно измени...
    Код (Text):
    1. if ( ctype_digit($_GET['page']) ) {
    2.  mysql_query('бла-бла-бла'.$_GET['page']);
    3. }
    А вообще мы это уже обсуждали, но каждый раз находится кто-то кто не понимает о чём я говорю, и убеждает меня что без приведения типов делать неправильно...

    А вообще в наше время пора бы уже начать забывать о MySQL и смотреть ТОЛЬКО в сторону MySQLi и PDO
     
  24. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    как?

    я не вижу принципиальной разницы.
     
  25. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Обычно, в web это совершенно не нужно. В какой нибудь системной библиотеке где надо работать с битами возможно что-то подобное и было бы нужно (привести к int и проверять биты) но такие вещи не пишутся на РНР

    А суслика видишь ?
    Два равносильных, на первый взгляд кода
    Код (Text):
    1. $page = isset($_GET['page']) && ctype_digit($_GET['page']) ? $_GET['page'] : 0;
    Код (Text):
    1. $page = isset($_GET['page']) ? intval($_GET['page']) : 0;
    А теперь смотрим разницу, и смотрим логику скрипта (что мы ждём и что получаем) разница становится очевидна.

    Добавлено спустя 10 минут 27 секунд:
    Вообще по ходу топик превращается в проход по второму кругу этого топика viewtopic.php?f=18&t=41075 (включая основные действующие лица)