В скрипте ранее использовал на проверку переменных вот такой код: htmlspecialchars(stripslashes(trim($_GET['info'])));, но при изменениях в скрипте, нужна только сравнение переменной на цифры и начал использовать is_numeric($_GET['info']), не смогут ли обойти эту функцию, вот код. Код (Text): if (is_numeric($_GET['info'])) { $result = mysql_query("UPDATE " . $dbPrefix . "_test SET info = '".$_GET['info']."' WHERE id = 1", $_DB); }
Тебе советуют принудительно привести к типу integer, чтобы точно быть уверенным, что в переменной $info окажется только число: Код (PHP): $info = (int)$_GET['info']; Функция is_int не известно, как устроена, нужно исходники смотреть, может, там уязвимость есть.
нужно просто понять что и где происходит, тогда всё будет просто и не придётся писать бессмысленных конструкций вроде htmlspecialchars(stripslashes(trim($_GET['info'])))
$_GET['info'] - должно быть только целое число, записываемое в базу. Да и число не должно быть минусовым, наверно лучшая проверка и защита вот такой код: $_GET['info'] > 0 или его можно обойти?
уфф, тяжело. Код (PHP): $info = (int)$_GET['info']; //принудительно приводишь к целому числу, что бы там ни было в параметре "info" if($info < 0){$info = 0;} //принудительно приводишь к нужному минимальному числу, если вдруг оказалось меньше минимального
Да дело не в этом, я знаю что это просто, меня интересует одна две функции, которые нельзя обойти, а не громоздкий код. Поэтому и спрашиваю про is_numeric.
А дальше что? Сделаете Код (Text): mysql_query("UPDATE " . $dbPrefix . "_test SET info = '".$_GET['info']."' WHERE id = 1", $_DB); ?
Ну если она осталась прежним, толку то, что мы её проверяем? Код (Text): $_GET['info'] = '5 "; fucking sql-injection'; if ((int)$_GET['info'] > 0) { // 5 > 0
Как какой толк, если переменная info не целое положительное число, запись в базу не проходит. А если переменная info является целым положительным числом, то в базу записывается это число, так как проверка уже была произведена, переменная содержит целое число больше нуля. А от одинарных кавычек в php.ini имеется magic_quotes_gpc = on. Почему я сделал вывод не использовать фильтр на одинарные кавычки с помощью PHP, а именно настройкой php.ini, потому что в PHP 6 фильтры такие не нужны будут в php, а какой смысл лишний код писать.
$var = isset($_POST['var']) ? abs((int) $_POST['var']) : 0; if($var) { } Удовлетворяет условия: только число, больше нуля.
Происходит, "5 любая хрень" приведётся к 5-и, а в запрос пойдёт вся строка. PHP 6 уже год как окончательно загнулся. Это единственное что я могу ответить на последний абзац, так как остального понять не смог.
Либо по-своему: Код (PHP): if(is_int($_GET['info'])) Либо по-хорошему: создавая переменную с числом Код (PHP): $info = (int)$_GET['info']; и пользуясь этой переменной в запросах. А делать проверку Код (PHP): if((int)$_GET['info'] > 0) нет смысла, как ты уже, наверное, понял, т.к. в любом случае будет true, даже если прийдет текст.
можно прогнать через фильтр filter_var, $number = filter_var($_GET['info'], FILTER_SANITIZE_NUMBER_INT); он оставит в переменной только число
get=(int)get. всё. этого достаточно 100%. в базе поле ансигнед делаешь и дело в шляпе. но я бы проверил на больше нуля если это требуется. проверять надо права юзера на запись. а если уж юзер с правами делает диверсию такую, то ничего не мешает ему же в самом интерфейсе удалить всё. =)
Это не сработает никогда, в GET (/POST/COOKIE/REQUEST) всегда приходит строка текста, даже если там только цифры.