За последние 24 часа нас посетил 55451 программист и 1710 роботов. Сейчас ищет 1501 программист ...

is_numeric не имеет обхода?

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

  1. ng0d

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

    С нами с:
    7 фев 2009
    Сообщения:
    100
    Симпатии:
    0
    Адрес:
    Латвия
    В скрипте ранее использовал на проверку переменных вот такой код: htmlspecialchars(stripslashes(trim($_GET['info'])));, но при изменениях в скрипте, нужна только сравнение переменной на цифры и начал использовать is_numeric($_GET['info']), не смогут ли обойти эту функцию, вот код.

    Код (Text):
    1. if (is_numeric($_GET['info'])) {
    2.         $result = mysql_query("UPDATE " . $dbPrefix .
    3.             "_test SET info = '".$_GET['info']."' WHERE id = 1",
    4.             $_DB);
    5.     }
     
  2. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    просто приведи ее к инту и не парься?
     
  3. ng0d

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

    С нами с:
    7 фев 2009
    Сообщения:
    100
    Симпатии:
    0
    Адрес:
    Латвия
    Использовать вот такое is_int(is_numeric($_GET['info'])) ? То-есть такое нельзя будет обойти?
     
  4. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Тебе советуют принудительно привести к типу integer, чтобы точно быть уверенным, что в переменной $info окажется только число:
    Код (PHP):
    1. $info = (int)$_GET['info']; 
    Функция is_int не известно, как устроена, нужно исходники смотреть, может, там уязвимость есть.
     
  5. vasa_c

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

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    нужно просто понять что и где происходит, тогда всё будет просто и не придётся писать бессмысленных конструкций вроде htmlspecialchars(stripslashes(trim($_GET['info'])))
     
  6. ng0d

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

    С нами с:
    7 фев 2009
    Сообщения:
    100
    Симпатии:
    0
    Адрес:
    Латвия
    $_GET['info'] - должно быть только целое число, записываемое в базу. Да и число не должно быть минусовым, наверно лучшая проверка и защита вот такой код: $_GET['info'] > 0 или его можно обойти?
     
  7. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    уфф, тяжело.
    Код (PHP):
    1. $info = (int)$_GET['info']; //принудительно приводишь к целому числу, что бы там ни было в параметре "info"
    2. if($info < 0){$info = 0;} //принудительно приводишь к нужному минимальному числу, если вдруг оказалось меньше минимального 
     
  8. ng0d

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

    С нами с:
    7 фев 2009
    Сообщения:
    100
    Симпатии:
    0
    Адрес:
    Латвия
    Да дело не в этом, я знаю что это просто, меня интересует одна две функции, которые нельзя обойти, а не громоздкий код. Поэтому и спрашиваю про is_numeric.
     
  9. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Тебе и дают минимальный и самый удобный вариант вместо громоздкого или непонятного.
     
  10. ng0d

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

    С нами с:
    7 фев 2009
    Сообщения:
    100
    Симпатии:
    0
    Адрес:
    Латвия
    Добавлено спустя 9 минут 49 секунд:
    Код (Text):
    1. if ((int)$_GET['info'] > 0)
    Тему можно закрывать.
     
  11. vasa_c

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

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    А дальше что?
    Сделаете
    Код (Text):
    1. mysql_query("UPDATE " . $dbPrefix .
    2.             "_test SET info = '".$_GET['info']."' WHERE id = 1",
    3.             $_DB);
    ?
     
  12. ng0d

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

    С нами с:
    7 фев 2009
    Сообщения:
    100
    Симпатии:
    0
    Адрес:
    Латвия
    А что такое? Если не будет положительное число, запись не пройдёт.
     
  13. vasa_c

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

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    в $_GET['info'] осталось то что было изначально
     
  14. ng0d

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

    С нами с:
    7 фев 2009
    Сообщения:
    100
    Симпатии:
    0
    Адрес:
    Латвия
    Да. Говорите сразу что именно, можно сделать инъекцию?
     
  15. vasa_c

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

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Ну если она осталась прежним, толку то, что мы её проверяем?

    Код (Text):
    1. $_GET['info'] = '5 "; fucking sql-injection';
    2. if ((int)$_GET['info'] > 0) { // 5 > 0
     
  16. ng0d

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

    С нами с:
    7 фев 2009
    Сообщения:
    100
    Симпатии:
    0
    Адрес:
    Латвия
    Как какой толк, если переменная info не целое положительное число, запись в базу не проходит. А если переменная info является целым положительным числом, то в базу записывается это число, так как проверка уже была произведена, переменная содержит целое число больше нуля. А от одинарных кавычек в php.ini имеется magic_quotes_gpc = on. Почему я сделал вывод не использовать фильтр на одинарные кавычки с помощью PHP, а именно настройкой php.ini, потому что в PHP 6 фильтры такие не нужны будут в php, а какой смысл лишний код писать.
     
  17. Апельсин

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

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    $var = isset($_POST['var']) ? abs((int) $_POST['var']) : 0;

    if($var) {

    }
    Удовлетворяет условия: только число, больше нуля.
     
  18. vasa_c

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

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Происходит, "5 любая хрень" приведётся к 5-и, а в запрос пойдёт вся строка.

    PHP 6 уже год как окончательно загнулся. Это единственное что я могу ответить на последний абзац, так как остального понять не смог.
     
  19. ng0d

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

    С нами с:
    7 фев 2009
    Сообщения:
    100
    Симпатии:
    0
    Адрес:
    Латвия
    Всё же наверно лучше проверки на цифры if (is_numeric($_GET['test'])) нет.
     
  20. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Либо по-своему:
    Код (PHP):
    1. if(is_int($_GET['info'])) 
    Либо по-хорошему: создавая переменную с числом
    Код (PHP):
    1. $info = (int)$_GET['info']; 
    и пользуясь этой переменной в запросах.

    А делать проверку
    Код (PHP):
    1. if((int)$_GET['info'] > 0) 
    нет смысла, как ты уже, наверное, понял, т.к. в любом случае будет true, даже если прийдет текст.
     
  21. jenya777777

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

    С нами с:
    16 мар 2010
    Сообщения:
    562
    Симпатии:
    0
    можно прогнать через фильтр filter_var, $number = filter_var($_GET['info'], FILTER_SANITIZE_NUMBER_INT);
    он оставит в переменной только число
     
  22. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Код (PHP):
    1. if(intval($_GET['info'])){echo $_GET['info']; /*1-9*/}else{echo $_GET['info']; /*0*/} 
     
  23. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    get=(int)get. всё. этого достаточно 100%. в базе поле ансигнед делаешь и дело в шляпе. но я бы проверил на больше нуля если это требуется.

    проверять надо права юзера на запись. а если уж юзер с правами делает диверсию такую, то ничего не мешает ему же в самом интерфейсе удалить всё. =)
     
  24. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Это не сработает никогда, в GET (/POST/COOKIE/REQUEST) всегда приходит строка текста, даже если там только цифры.
     
  25. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    sobachnik, ок, верно.