Вопросов куча Буду рад если ув. знатоки помогут найти ответы хоть на часть! Вопросы по проверке переданых числовых параметрах. в дополнение к $param = intval($_GET['param']) и $param = (int) $_GET['param'];, нашел еще и sprintf("%d", $param);! Создаю запрос с помошью sprintf, есть переданые параметры-числа, так может и не проверять эти параметры, все что не так sprintf переведет в ноль? Где почитать: уязвимо ли приведение типов? Может все таки для int(4) приведение типов лучше? preg_match - просто проверит какие символы, но хотелось бы и в диапазон попасть. Например если число "помещается" в int(4), то перед тем как отдать его в MySQL - сделать приведение типов, а потом проверит if >= && <= или как? Для проверки на число использую if (preg_match("/\D/", _GET['param'])) { ОШИБКА: Присутствуют не числовые сиволы };. Но хотелось бы как-то красиво проверять и диапазон. Подскажите? Как быть с MySQL - bigint(20) unsigned, в PHP нет такого. Нашел еще settype, это одно и тоже что и преведение типав? ) Или есть какое-то отличие?
ну я неправильно написал, int! Я так понимаю отличие только в 32бит 64бит - системах Но не суть это, а то мои вопросы убегут далеко вверх ( вот еще нашел is_numeric -- Finds whether a variable is a number or a numeric string, что скажете, можна(точнее лучше) ли ею пользоваться для проверки переданого параметра-числа?
Да. Что значит уязвимо? Приведение типов это конструкция языка. PHP: <?php $id = isset($_GET['id']) ? (int)$_GET['id'] : 0; if ($id < 0 || $id > 255) { print 'ошибка'; }
Спасибо!!!!!!!! ) Еще на странице http://php.ru/manual/types.comparisons.html нашел Т.е для чисел не требуется никаких регулярных выражений. Остается только проверить диапазон перед "отправкой" в MySQL - получается так. Это понял! ) Остается вопрос на счет bigint(20)?. Есть еще кое-что не понятно - т.е. для не определенной переменной empty() также спокойно! выдасть True? Еще: Т.е. для чисел, которые могут содержать "0" empty() не подходит? - смущает ИЛИ в empty() или isset(), т.е. можно спокойно использовать просто empty()? И таким образом "облегчать" код?
А что тебе не нравится? Никто не отменял if ($chislo>0) {} Вообще такие вещи можно и самому проверить. Нет, не подходит. Повнимательнее почитать про разницу между конструкциями "==" и "===" - тогда разберёшься. Разницу видишь?
RomanBush вам спасибо! Эх ссылку бы ) Поисщу сам ) (добавил: нашел http://php.ru/manual/language.operators.comparison.html ) да у меня просто как-то в голове не уложится что делать например если будет "999999999999999999999999999999999999999..." ну и так далее какое там максимум. Вообщем хочу чтобы SQL ошибку не выдавал, хочу перхватывать такое с пояснениями. Хотя может действительно это я зря? может хватит и if (mysql_query($query)) ? Просто охота как то уменьшить риск, а приведение к int не выход, может тогда делать if (!preg_match("/\D/", $_POST['ID'])) а потом strlen? тогда нужно узнать строку максимального числа для bigint(20)
Тебе реально необходимо хранить такие большие числа? Обычно, я знаю числа из какого диапазона меня интересуют.
Я не понимаю, по поводу какого риска ты переживаешь? Если по поводу того, что придут неверный инпут от пользователя - то в таком случае достаточно понять, что ввод неверный и соообщить об этом пользователю, чтобы он поправил данные. Для этого достаточно и if (!$q=myslq_query()). Если же ты боишься sql-инъекции - как от неё защититься тут уже неоднократно обсуждалось. Если речь только про числа - достаточно простого приведения типов - php при приведении сам всё "опасное" отбросит. зачем? Для того, чтобы самому вывести сообщение об ошибке? Немного странно звучит - не находишь?
По поводу больших чисел - работал как-то с 21 знаковым числовым идентификатором. PHP как число обработать его не мог, т.к. это был Unsigned bigint, а в PHP оно signed всегда, даже 64 бита спасовали. Так что иногда такие вещи бывают (в данном случае это биллинг) и приходится обрабатывать как строки такие числа.
Psih Да получается только как со строками! Или как советуют на if (!$q=myslq_query()) надеятся и читать бюююллитень безопасности от разработчиков mysql
Да нет я согласен всегда истинно! RomanBush какой-то больно злой ты парень, не в обиду! ) Я не перживаю по поводу какого-то конкретного риска, я переживаю о возможном риске, я же сказал я новичек, и о риске спрашиваю у вас. В твоем случае следовало бы сказать: не переживай новичек, тут риска нет, это говорю тебе я! ) И все.