2012-05-31 29 views
5

Salvando i dati nel mio db (mysql) con "serialize ($ array);". Questi dati provengono da un modulo con un campo di input. Voglio sapere cosa succede se inserisco qualcosa come "a: 4: {i: 1; s: 7:" fdsfdsf "; i" nel campo modulo. potrebbe rompere i miei dati memorizzati nel DB? Grazie !!Php Serializzare i dati in Mysql

risposta

9

Ho testato il tuo esempio sul mio sistema, e dopo la serializzazione, viene restituito il valore seguente:

string(42) "a:1:{i:0;s:24:"a:4:{i:1;s:7:"fdsfdsf";i";}" 

Questo è ciò che verrà aggiunto al database. Tuttavia, l'archiviazione dell'input dell'utente in chiaro nel database è fortemente scoraggiata. Dovresti prima formattare l'input utente semplice con mysql_real_escape_string() in quanto sfuggirà ai personaggi critici.

A parte questo, se unserialize() viene chiamato sul testo serializzato riletti dal database, l'array viene correttamente restituito. Dovrebbe essere sicuro, ma può produrre risultati inaspettati.

Fare estrema attenzione con l'archiviazione di array serializzati in un database. La serializzazione restituisce una stringa, quindi il campo in cui si memorizzano i dati è in genere VARCHAR o TEXT. Se semplicemente si sovrascrive lo array memorizzato con uno nuovo, i vecchi dati saranno completamente persi. Per aggiornare il database, assicurarsi di aver prima letto i dati dal database in un array e aggiornarlo, quindi solo dopo averlo riscritto nel database.

Mentre non è vietato, l'utilizzo e l'archiviazione di materiale serializzato nel database di solito crea un sacco di problemi. Il database ha un sacco di tipi di dati noti per impostazione predefinita, e grandi array serializzati creano un sovraccarico e complicano l'esecuzione, ed è semplicemente un rompicapo se il sistema deve essere successivamente modificato. E non è possibile utilizzare le query di relazione su campi serializzati.

+0

Grazie per la risposta e le raccomandazioni, è stato molto utile !!! – alejoabella

+2

Poiché i dati serializzati php restituiscono dati binari, non utilizzare VARCHAR o TEXT ma piuttosto VARBINARY o BLOB. –

6

Il vecchio modo

Quando si sta ancora utilizzando mysql_ si potrebbe scrivere query come questo:

$sql = sprintf("INSERT INTO mytable (a) VALUES ('%s')", 
    mysql_real_escape_string(serialize($myvar)) 
); 
mysql_query($sql) or die("oh no!"); 

Il metodo consigliato

Per PDO e mysqli si ottiene il possibilità di utilizzare istruzioni preparate, che vengono altamente raccomandate esattamente allo scopo di prevenire SQ L vettori di attacco per iniezione. Un esempio in PDO:

$stmt = $db->prepare('INSERT INTO mytable (a) VALUES (:myvar)'); 
$stmt->execute(array(
    ':myvar' => serialize($myvar), 
)); 

Campo lunghezze

Inoltre, assicurarsi che la lunghezza dei dati serializzati non superi la dimensione della colonna del campo della tabella; una variabile serializzata troncata è praticamente inutile.

+1

@alejoabella Prego. Tornando a questa risposta, mi sono reso conto che dopotutto non era poi così bello, quindi l'ho rivisto :) –

+0

um .... come fanno esattamente le dichiarazioni preparate a prevenire le iniezioni, ancora? Esattamente - non lo fanno. Affatto. – specializt

+1

@specializt Le dichiarazioni preparate non sono magiche da questo punto di vista, le persone possono ancora (e lo fanno) rovinare tutto, come evidenziato dal recente [Drupal advisory] (https://www.drupal.org/SA-CORE-2014- 005). Tuttavia, se ritieni che l'affermazione nella mia risposta possa essere sfruttata, fammi sapere come ciò potrebbe essere raggiunto. –

Problemi correlati