2011-10-07 23 views
9

Ho il seguente array e vorrei sapere quale sarebbe il modo migliore di convalidare e santizing questo array per assicurarci che gli numeri interi solo siano consentiti?PHP Santizing/Validating Array of Integers

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

che assomiglia a questo quando stampate:

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

So che l'esc_attr non è molto sicuro, in modo vorrebbe qualcosa di un po 'più potenziato.

Qualsiasi aiuto sarebbe fantastico.

Cheers,

Dave

+0

le precipitava INT non importa cosa ... –

+0

Se fosse una stringa mi basta usare (int), ma c'è qualcosa simile ad usare per un array? Grazie per la tua risposta – daveaspinall

+0

lo fai per i valori degli array sul loop –

risposta

12

Dal momento che è i dati $_POST, ti consigliamo di verificare la presenza di ctype_digit (vale a dire una stringa contenente solo cifre):

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

Si noti che questo semplicemente scarta valori non numerici.

+0

appena provato questo e sembra che stia funzionando a posto, grazie per tutti i commenti Elses a proposito, molto utile! Quanto è sicuro questo? Se qualcuno dovesse iniettare qualcosa in questo array? (Abbiamo avuto alcuni problemi con l'hacking, quindi sto esaminando tutto il codice e collegando tutti i buchi). Cheers – daveaspinall

+0

Con questo si può essere sicuri che '$ sanitizedValues' contiene solo stringhe che contengono solo numeri. Niente di più, niente di meno. – deceze

+0

Molto bello e molto pulito. Saluti @deceze e tutti gli altri che hanno postato una risposta. – daveaspinall

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

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

I dati POST non sono mai 'int', sono tutte stringhe. – deceze

+0

questo appare come numeri: Array ( [0] => 13 [1] => 12 ) – MasterCassim

+1

Sì, ma sono le stringhe * *, non 'int's. – deceze

3

Un'alternativa sarebbe utilizzando phps filter funzioni:

$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

Molto più prolisso ma tecnicamente più appropriato. +1 :) – deceze

+0

Scusate ragazzi, qual è la differenza tra i due? – daveaspinall

+0

Se è un singolo campo che stai convalidando, penso che sia solo una questione di gusti. Anche se hai molte convalide delle funzioni del filtro puoi risparmiare un po 'di lavoro (vedi [filter_input_array] (http://php.net/manual/function.filter-input-array.php) per esempio). E suppongo che se tu o qualcun altro dovessi capire cosa stai facendo 3 mesi dopo, la funzione filtro mostra più chiaramente che cosa sta succedendo. – Yoshi