FILTER_VALIDATE_INT проверяет значения в кодировке URL как INT

Почему query: *.php?page=%20%209999%20%20 и есть *.php?page=%0a%0d9999%0a%0d подтвердить как INT и вернуть как int(9999)?

$args=array('page'=>array('filter'=>FILTER_VALIDATE_INT)));
$ret=filter_input_array(INPUT_GET,$args);

var_dump($ret['page']);

0

Решение

Кодированный URL:

*.php?page=%20%209999%20%20

Расшифрованный URL-адрес:

*.php?page=  9999

следовательно, вы наблюдаете int(9999), %20 а также %0A пробелы и переносы строк соответственно. Такое поведение можно наблюдать с помощью следующего кода:

$_GET["page"] = "  9999  ";
$name = filter_var($_GET["page"], FILTER_VALIDATE_INT);
var_dump($name);

INT (9999)

Эти URL-кодированные пробелы и разрывы кодируются до того, как они попадут в ваш фильтр, и FILTER_VALIDATE_INT не так строго с пробелами.

Один из способов настройки фильтра — использовать Перезвоните быть более строгим с целочисленным тестированием:

$_GET["page"] = "  9999   ";

function FILTER_VALIDATE_STRICT_INT($val) {
return intval(urlencode($val)) === intval($val) ? intval($val) : false;
}

$args=array(
'page'=>array(
'filter'=>FILTER_CALLBACK,
'options'=>"FILTER_VALIDATE_STRICT_INT"));
$ret=filter_var_array($_GET, $args);

var_dump($ret['page']);

Возвращает

BOOL (ложь)

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]