FILTER_VALIDATE_INT 将 URL 编码值验证为 INT

FILTER_VALIDATE_INT validates URL encoded values as INT

为什么 query: *.php?page=%20%209999%20%20 和 id est *.php?page=%0a%0d9999%0a%0d 验证为 INT 而 return 验证为 int(9999)

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

var_dump($ret['page']);

编码后的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 编码的空格和换行符在到达您的过滤器之前会进行 url 解码,并且 FILTER_VALIDATE_INT 对空格的要求不那么严格。

调整过滤器的一种方法是使用 callback 以更严格地进行整数测试:

$_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']);

Returns

bool(false)