2011-10-07 19 views
9

Tengo la siguiente matriz y me gustaría saber cuál es la mejor manera de validar y santificar esta matriz para asegurarse de que solo enteros están permitidos?PHP Santizing/Validating Array of Integers

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

que tiene este aspecto cuando se imprimen:

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

Sé que el esc_attr no es muy seguro por lo que le gustaría algo un poco más reforzado.

Cualquier ayuda sería genial.

Saludos,

de Dave

+0

las echó en intercepciones no importa qué ... –

+0

Si se trata de una cadena que acababa de usar (int), pero hay algo similar al uso para una matriz? Gracias por su respuesta – daveaspinall

+0

que haces eso para los valores de la matriz en el bucle –

Respuesta

12

Ya que es $_POST de datos, tendrá que comprobar para ctype_digit (es decir, una cadena que contiene sólo dígitos):

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

Tenga en cuenta que este simplemente descarta valores no numéricos.

+0

acaba de probar esto y parece estar trabajando en el lugar, gracias por todos los elses comentarios por cierto, muy útil! ¿Qué tan seguro es esto sin embargo? Si alguien fuera a inyectar algo en esta matriz? (Hemos tenido algunos problemas con la piratería, por lo tanto, estoy revisando todo el código y tapando los agujeros). Cheers – daveaspinall

+0

Con esto puede estar seguro de que '$ sanitizedValues' contiene solo cadenas que contienen solo números. Nada más y nada menos. – deceze

+0

Muy agradable y muy limpio. Saludos @deceze y todos los demás que publicaron una respuesta. – daveaspinall

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

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

Los datos POST nunca son 'int', son todas las cadenas. – deceze

+0

esto se parece a los números: matriz ( [0] => 13 [1] => 12 ) – MasterCassim

+1

Sí, pero son cadenas * *, no 'int's. – deceze

3

Una alternativa sería utilizar phps filter funciones:

$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

Mucho más prolijo pero técnicamente más apropiado. +1 :) – deceze

+0

Lo siento chicos, ¿cuál es la diferencia entre los dos? – daveaspinall

+0

Si está validando un solo campo, creo que es solo cuestión de gustos. Aunque si tiene muchas validaciones, las funciones de filtro pueden ahorrarle algo de trabajo (consulte [filter_input_array] (http://php.net/manual/function.filter-input-array.php) por ejemplo). Y supongo que si usted u otra persona tiene que entender lo que está haciendo 3 meses después, la función de filtro muestra más claramente lo que está sucediendo. – Yoshi