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)
为什么 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)