2012-05-31 18 views
5

Guardando datos en mi db (mysql) con "serialize ($ array);". Esta información proviene de un formulario con un campo de entrada. Quiero saber qué sucede si inserto algo como "a: 4: {i: 1; s: 7:" fdsfdsf "; i" en el campo de formulario. podría romper mis datos almacenados en la base de datos? ¡Gracias!Php Serialize datos en Mysql

Respuesta

9

Probé tu ejemplo en mi sistema, y ​​después de serialización, se devuelve el valor siguiente:

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

Esto es lo que se añadirá a la base de datos. Pero, almacenar la entrada de usuario sin formato en la base de datos es altamente desaconsejado. Primero debe formatear la entrada de usuario simple con mysql_real_escape_string() ya que escapará de los caracteres críticos.

Aparte de eso, si se llama a unserialize() en la lectura de texto serializada de la base de datos, la matriz se devuelve correctamente. Debe ser seguro, pero puede producir resultados inesperados.

Sea extremadamente cuidadoso con el almacenamiento de matrices serializadas en una base de datos. La serialización devuelve una cadena, por lo que el campo en el que almacena los datos generalmente es VARCHAR o TEXTO. Si simplemente sobrescribe la matriz almacenada con una nueva, los datos antiguos se perderán por completo. Para actualizar la base de datos, asegúrese de leer primero los datos de la base de datos en una matriz y actualizarlos, y solo luego vuelva a escribirlos en la base de datos.

Si bien no está prohibido, el uso y almacenamiento de material serializado en la base de datos generalmente crea muchos problemas. La base de datos tiene muchos tipos de datos conocidos de manera predeterminada, y las grandes matrices serializadas crean sobrecarga y complican la ejecución, y es simplemente una molestia si el sistema necesita ser modificado posteriormente. Y no puede usar consultas de relación en campos serializados.

+0

¡Gracias por su respuesta y recomendaciones, ha sido muy útil! – alejoabella

+2

Como los datos serializados de PHP devuelven datos binarios, no use VARCHAR o TEXT, sino VARBINARIO o BLOB. –

6

La antigua forma

Cuando todavía está utilizando mysql_ se podría escribir consultas como esta:

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

La forma recomendada

Para PDO y mysqli se obtiene el opción de usar declaraciones preparadas, que viene muy recomendado para el propósito exacto de prevenir SQ L vectores de ataque de inyección. Un ejemplo de PDO:

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

longitudes de campo

También, asegúrese de que la longitud de los datos serializados no exceda el tamaño de columna del campo de tabla; una variable serializada truncada es bastante inútil.

+1

@alejoabella De nada. Volviendo a esta respuesta, me di cuenta de que no era tan buena después de todo, así que la he revisado :) –

+0

um ... ¿cómo exactamente las declaraciones preparadas previenen las inyecciones, otra vez? Exactamente, no lo hacen. En absoluto. – specializt

+1

@specializt Las declaraciones preparadas no son mágicas en ese sentido, la gente todavía puede (y lo hace) arruinarlo, evidenciado por el algo más reciente [aviso de Drupal] (https://www.drupal.org/SA-CORE-2014- 005). Sin embargo, si sientes que la declaración en mi respuesta puede ser explotada, házmelo saber cómo se puede lograr esto. –