为什么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']);
答案 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}}
返回
布尔(假)