2011-10-07 16 views
9

Mam następujące tablice i chciałbym wiedzieć, jaki jest najlepszy sposób sprawdzania poprawności i santizing tej tablicy, aby upewnić się, że tylko liczby całkowite są dozwolone?PHP Santising/Validating Array of Integers

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

Która wygląda to po wydrukowaniu:

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

Wiem esc_attr nie jest bardzo bezpieczna więc chciałby coś nieco bardziej podrasowanym.

Każda pomoc będzie świetna.

Cheers,

Dave

+0

oddanych im INT Nieważne co ... –

+0

Jeśli to był ciąg dalszy wystarczy użyć (int), ale jest tam coś podobne do użycia dla tablicy? Dzięki za odpowiedź – daveaspinall

+0

robisz to dla wartości tablicy w pętli –

Odpowiedz

12

Ponieważ jest to $_POST dane, będziemy chcieli, aby sprawdzić ctype_digit (czyli ciąg zawierający tylko cyfry):

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

Zauważ, że ten po prostu odrzuca wartości nieliczbowe.

+0

właśnie wypróbowany to i to wydaje się być działającym na miejscu, dzięki dla każdego elses komentarze przy okazji, bardzo pomocne! Jak bezpieczne jest to jednak? Jeśli ktoś miałby wstrzyknąć coś do tej tablicy? (Mieliśmy kilka problemów z hackowaniem, dlatego przeglądam cały kod i podłączam wszystkie dziury). Pozdrawiam – daveaspinall

+0

Dzięki temu możesz być pewien, że '$ sanitizedValues' zawiera tylko ciągi zawierające tylko liczby. Nic dodać nic ująć. – deceze

+0

Bardzo ładne i bardzo czyste. Pozdrawiam @deceze i wszystkich innych, którzy napisali odpowiedź. – daveaspinall

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

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

Dane POST nigdy nie są 'int', to wszystkie ciągi. – deceze

+0

To wygląda liczbach: Array ( [0] => 13 [1] => 12 ) – MasterCassim

+1

Tak, ale są ciągi * *, a nie 'int's. – deceze

3

Alternatywą byłoby korzystania phps filter funkcje:

$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

O wiele bardziej gadatliwy, ale technicznie bardziej odpowiedni. +1 :) – deceze

+0

Przepraszam chłopaki, jaka jest różnica między tymi dwoma? – daveaspinall

+0

Jeśli to jedno pole, które zatwierdzasz, myślę, że to tylko kwestia gustu. Chociaż jeśli masz wiele funkcji sprawdzania poprawności filtrów, możesz zaoszczędzić trochę pracy (patrz [filter_input_array] (http://php.net/manual/function.filter-input-array.php) na przykład). I myślę, że jeśli ty lub ktoś inny musisz zrozumieć, co robisz 3 miesiące później, funkcja filtra lepiej pokazuje, co się dzieje. – Yoshi