FILTER_VALIDATE_INT将URL编码值验证为INT

时间:2015-05-21 02:38:17

标签: php security filtering sanitization filter-var

为什么query*.php?page=%20%209999%20%20和id *.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']);

1 个答案:

答案 0 :(得分:2)

编码的网址是:

int(9999)

解码后的网址为:

%20

因此你观察%0A$_GET["page"] = " 9999 "; $name = filter_var($_GET["page"], FILTER_VALIDATE_INT); var_dump($name); 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']);
  

INT(9999)

这些URL编码的空格和分隔符在进入过滤器之前进行了urldecoded,而{{1}}对空格的限制并不严格。

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

{{1}}

返回

  

布尔(假)