За последние 24 часа нас посетили 19298 программистов и 1608 роботов. Сейчас ищет 881 программист ...

Проверка входящих данных, как лучше?

Тема в разделе "PHP и базы данных", создана пользователем Mr. T, 24 мар 2011.

  1. Mr. T

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

    С нами с:
    10 ноя 2010
    Сообщения:
    733
    Симпатии:
    0
    Адрес:
    Украина, г. Киев
    Вечер добрый, допустим есть запрос:

    [sql]SELECT * FROM table WHERE id = $_GET['id'][/sql]

    Поле "id"типа int. Как лучше организовать проверку?
    1. Проверять регулярным выражением, все, что не цифра - удалять?
    2. Проверить функцией is_numeric, потом обрезать c помощью функции intval?

    Также воспользоваться дополнительно real_escape_string.

    Как вариант лучше?
     
  2. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я долго мучался, а потом забил. пользуюсь функциями
    PHP:
    1.  
    2.   //  // <editor-fold defaultstate="collapsed" desc="strget - берет искомый элемент из массивов POST или GET и приводит его к String указанной длинны">
    3.    function strget($str='', $length = 255) {
    4.     if (isset($_POST[$str])) {
    5.       return trim(substr(trim($_POST[$str]), 0, $length));
    6.     }
    7.     if (isset($_GET[$str])) {
    8.       return trim(substr(trim($_GET[$str]), 0, $length));
    9.     }
    10.     return false;
    11.   }
    12.  
    13.   // </editor-fold>
    14.   //
    15.   // <editor-fold defaultstate="collapsed" desc="intget - берет искомый элемент из массивов POST или GET и приводит его к Integer">
    16.    function intget($str='') {
    17.     if (isset($_POST[$str])) {
    18.       return intval($_POST[$str]);
    19.     }
    20.     if (isset($_GET[$str])) {
    21.       return intval($_GET[$str]);
    22.     }
    23.     return false;
    24.   }
    25.  
    26.   // </editor-fold>
    27.  
     
  3. Mr. T

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

    С нами с:
    10 ноя 2010
    Сообщения:
    733
    Симпатии:
    0
    Адрес:
    Украина, г. Киев
    Ок, но эти функции не проверяют параметры на наличие запрещенных символов, я в своем вопросе имел ввиду не только проверку типа данных...
     
  4. Shumomer

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

    С нами с:
    12 мар 2011
    Сообщения:
    194
    Симпатии:
    1
    Адрес:
    из вашего вображения
    'SELECT * FROM table WHERE id = '.(int)$_GET['id']
     
  5. Mr. T

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

    С нами с:
    10 ноя 2010
    Сообщения:
    733
    Симпатии:
    0
    Адрес:
    Украина, г. Киев
    Если я правильно понимаю суть дела, то это тоже самое, что я предложил в своем первом посте, т.е. intval ($_GET['id']), но это не дает ответ на вопрос, как проверять лучше :)
     
  6. Shumomer

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

    С нами с:
    12 мар 2011
    Сообщения:
    194
    Симпатии:
    1
    Адрес:
    из вашего вображения
    Почти то-же. А про лучше - что значит "лучше" в данном случае, для вас?
     
  7. Mr. T

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

    С нами с:
    10 ноя 2010
    Сообщения:
    733
    Симпатии:
    0
    Адрес:
    Украина, г. Киев
    Более грамотно и правильно с точки зрения безопасности.
     
  8. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Mr. T
    конечно не проверяют! и не надо =)

    просто надо юзать перед вставкой в запрос к БД значений от функции strget ченить типа mysql_real_escape или аналог с mysqli

    а intget дает безопасные значения.
     
  9. Mr. T

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

    С нами с:
    10 ноя 2010
    Сообщения:
    733
    Симпатии:
    0
    Адрес:
    Украина, г. Киев
    Т.е. достаточно использовать эти две функции и функцую mysql_real_escape_string и все?
     
  10. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    достаточно использовать риал_эскейп и постить что угодно без проверки =)