2015-05-21 23 views
0

爲什麼query*.php?page=%20%209999%20%20和id EST *.php?page=%0a%0d9999%0a%0d驗證爲INT並返回作爲int(9999)FILTER_VALIDATE_INT驗證URL編碼值INT

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

var_dump($ret['page']); 
+0

那些「URL編碼值「只是空格'%20'和換行符'%0A'。 – mario

+0

urldecode()第一個 –

+0

@mario右邊,但是空格和換行符的整數是什麼時候? – KaekeaSchmear

回答

2

編碼的網址是:

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

解碼後的網址是:

*.php?page= 9999 

因此你觀察int(9999)%20%0A分別是空格和換行符。可以用下面的代碼可以觀察到這種現象:

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

INT(9999)

這些URL編碼的空間和休息,他們得到過濾器,然後被urldecoded,並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']); 

返回

布爾(假)

+0

這是更多的觀察,你不同意嗎?馬里奧已經在評論中說明 –

+0

「爲什麼查詢:...驗證爲INT,並返回int(9999)「 - 這就是問題 – Drakes

+0

好吧,然後再次..OP確實問*爲什麼... *所以......他們從來沒有問過如何解決它大聲笑是的..你是對的;-) –