2011-10-07 71 views
9

我有以下數組,並想知道驗證和santizing這個數組以確保只有整數允許的最佳方式是什麼?PHP Santizing /驗證數組整數

if(is_array($_POST['taxonomy'])) { 
    $term_ids = array_map('esc_attr', $_POST['taxonomy']); 
} 

,看起來像這樣打印時:

Array 
(
    [0] => 13 
    [1] => 12 
) 

我知道esc_attr是不是很安全所以想一些更加強了。

任何幫助將是偉大的。

乾杯,

戴夫

+0

它們轉換成的INT不管是什麼... –

+0

如果這是一個字符串,我只是用(INT),但有什麼類似於用於數組?感謝您的回覆 – daveaspinall

+0

您可以在循環中爲數組值進行此操作 –

回答

12

由於它是$_POST數據,你要檢查ctype_digit(即只包含數字的字符串):

$sanitizedValues = array_filter($_POST['taxonomy'], 'ctype_digit'); 

注意,這簡單地丟棄非數字值。

+0

剛剛嘗試過這一點,它似乎是工作現場,感謝大家elses評論的方式,非常有幫助!這有多安全?如果有人將某些東西注入到這個數組中? (我們遇到了一些黑客問題,因此我正在瀏覽所有代碼並堵住任何漏洞)。乾杯 – daveaspinall

+0

有了這個,你可以確定'$ sanitizedValues'只包含只包含數字的字符串。沒有更多,沒有更多。 – deceze

+0

非常好,很乾淨。乾杯@deceze和其他所有發佈回覆的人。 – daveaspinall

1
foreach($array as $key => $value) { 
    $array[$key] = (int) $value; 

    if($array[$key] != $value) { 
     // error 
    } 
} 
+0

POST數據永遠不是'int',它都是字符串。 – deceze

+0

這看起來像數字: 陣列 ( [0] => 13 [1] => 12 ) – MasterCassim

+1

是的,但它們是* *字符串,不'int's。 – deceze

3

另一種方法是使用PHPS filter功能:

$array = array(
    13, 12, '1', 'a' 
); 

$result = filter_var($array, FILTER_VALIDATE_INT, array(
    'flags' => FILTER_REQUIRE_ARRAY, 
    'options' => array('min_range' => 1) 
)); 

var_dump($result); 

/* 
array(4) { 
    [0]=> 
    int(13) 
    [1]=> 
    int(12) 
    [2]=> 
    int(1) 
    [3]=> 
    bool(false) 
} 
*/ 
+0

更詳細但技術上更合適。 +1 :) – deceze

+0

對不起大家,兩者有什麼區別? – daveaspinall

+0

如果這是一個你正在驗證的領域,我認爲這只是一個品味問題。雖然如果你有很多驗證過濾器的功能可以節省你一些工作(例如參見[filter_input_array](http://php.net/manual/function.filter-input-array.php))。我猜,如果你或其他人必須瞭解你在3個月後做了什麼,過濾器功能會更清楚地顯示發生了什麼。 – Yoshi