За последние 24 часа нас посетили 17920 программистов и 1615 роботов. Сейчас ищут 1343 программиста ...

Предохранитель от SQL-инъекций

Тема в разделе "Регулярные выражения", создана пользователем Freakmeister, 21 июл 2012.

  1. Freakmeister

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

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    Есть строчная переменная, которая берётся из $_POST или $_GET и вставляется в SQL-запрос. Как проверить её на наличие слов в любом регистре: INSERT, DELETE, UPDATE, SELECT? И ещё попутный нубский вопрос, SQL-инъекции возможны только через GET-запрос, или через POST тоже?
     
  2. Крыс

    Крыс Активный пользователь

    С нами с:
    3 фев 2012
    Сообщения:
    449
    Симпатии:
    0
    http://www.php.ru/manual/function.strpos.html

    а вообще вы фигнёй страдаете, это делается через mysql_real_escape_string
    гет, пост, куки - всё что вы потом используете в запросе
     
  3. oksana

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

    С нами с:
    16 мар 2012
    Сообщения:
    221
    Симпатии:
    0
  4. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    в последующих выборках можно нарваться на инъекции второго порядка =)
     
  5. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Раньше делалось.. Лет 10 назад... Сейчас это делается использованием "Prepared statement"
     
  6. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    По этому на mysqli дружно переходим...
    И другое.

    Ну или тогда в массив и метод в нижний регистр и реплэйсом удалить...
     
  7. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    mysqli еще работает по-старинке
     
  8. Freakmeister

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

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    Короче сделал через четверной strpos, от вас не дождёсся.)
     
  9. igordata

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

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

    Говнокодер теперь ты, юный падован.
     
  10. Freakmeister

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

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    Мда, я кстати посидел вчера, покурил и понял, что не стоило так делать.) Потому что там обрабатываются пользовательские поля, и там вполне могут быть слова select, delete, update, insert. Не говоря уже о html-теге <select>. В общем, решил вручную проверять только is_numberic, а все строчные значения прогоняю через mysql_real_escape_string. Этого точно достаточно, чтобы защититься от SQL-инъекций?
     
  11. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Достаточно будет экранирования, все остальное делается вообще для других целей, отсеивание не нужной информации...
     
  12. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Да. От первой волны.

    Однако, если кривые данные попадут в базу, то можно будет какнить исхитриться, и их присобачить куданить как часть запроса.
    Соотв, когда ты берёшь значения своего поля из бд, и вставляешь в запрос, то это тоже надо экранировать, несмотря на то, что это "из твоей же базы". Ну ты понял.
     
  13. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    is_numberic тоже идёт нафик... mysql_real_escape_string для своих целей подходит, а is_numberic это вообще из другой оперы !!!
     
  14. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ой, да. для целочисленных данных (int) рулит.
     
  15. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    int вообще не из той оперы, расстреливал бы сразу... нету никакого int-а не существует просто !!!
     
  16. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Не неси чепухи
     
  17. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Что значит не существует?

    Ты, чего?
    (int), (integer) приведение к целочисленному типу данных.

    intval();

    Тебе стоит точно суда заглянуть:
    php.net/manual/ru/language.types.type-juggling.php
     
  18. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    А как ты цитируешь так, что ник одного человека, а фраза другого?
     
  19. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Оо Это, что - то забакланило =)))). Хм...
    Адресовано Vladson.

    Код (PHP):
    1. $int1=10; // это целое число
    2. $str1=''.$int1.''; // это явная строка
    3. $str2=(string)$int1; // это явная строка
    4. $str3="$int1"; // это строка (не рекомендуется для проверки явной строки)
    5. $int2=(int)$str1; // это целое число
    6.  
    7. var_dump($int1, // int(10)
    8.          $str1, // string(2) "10"
    9.          $str2, // string(2) "10"
    10.          $str3, // string(2) "10"
    11.          $int2); // int(10)   
     
  20. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Это значит что он существует, но к SQL а точнее к инъекциям никакого отношения он не имеет. При составлении запросов мы используем строки и их отправляем в запрос. Приведение типов это вмешательство в данные, а их не надо трогать вообще. Просто грамотно использовать.


    По порядку
    - Принимаем $_GET в котором номер например страницы. (он кстати string)
    - ПРОВЕРЯЕМ что в нём именно положительное число. (что это строка, а в строке только цифры)
    - Отправляем в SQL-запрос без изменений.

    Всякие джедайские техники типа $sql="SELECT * WHERE `id` = " . (int)$_GET['id'] это бред который для новичков пишут, это чаще всего работает (если число до двух миллиардов) но это нарушение всех известных принципов программирования, это самый настоящий "костыль"
     
  21. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    если у меня поле инт, я беру и кастую (int) и я обезопашен на 100% и мне срать какие там данные были присланы.
    =) счастье!
     
  22. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Если оно int то и приводить не надо, к SQL и прочим GET/POST данным это отношения не имеет !!!
     
  23. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Дык реч о присланных данных которые пойдут в числовое поле.
     
  24. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Данные идут не в поля, а в SQL запрос, в том виде в котором они должны идти. Хоть в HEX их пиши, в итоге всё равно будет SQL запрос.
     
  25. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Пора тебе с водочкой завязывать...