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
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.
Una forma de bloquear esto es escapando las comillas antes de insertar datos en la base de datos.
usted puede hacer esto con mysqli_real_escape_string()
http://www.php.net/manual/en/mysqli.real-escape-string.php
Gracias johannes !! – alejoabella
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.
@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 :) –
um ... ¿cómo exactamente las declaraciones preparadas previenen las inyecciones, otra vez? Exactamente, no lo hacen. En absoluto. – specializt
@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. –
- 1. PHP - * fast * serialize/unserialize?
- 2. angularjs serialize form data
- 3. No entiendo serialize()
- 4. Importación de datos CSV usando PHP/MySQL
- 5. CodeIgniter/PHP/MySQL: Recuperar datos con JOIN
- 6. ¿MySQL no está obteniendo datos correctos? (PHP)
- 7. Conde en php mysql
- 8. serialize() y $ _SESSION
- 9. Caracteres especiales en PHP/MySQL
- 10. Funciones en mysql o php
- 11. ¿Base de datos vacía en MySQL y PHP?
- 12. Obtener datos de MYSQL en JSON usando PHP
- 13. Generar volcado de datos MySQL en SQL desde PHP
- 14. Borrar datos en la tabla MySQL con PHP?
- 15. PHP - Almacenamiento de texto en la base de datos MySQL
- 16. PHP- insertando datos binarios en mysql usando declaraciones preparadas
- 17. Obtenga datos de mysql en android con php
- 18. django serialize queryset.values () en json
- 19. Nuevo en PHP/MySQL
- 20. inserta matriz php en mysql
- 21. PHP/MySQL paginación
- 22. php mysql timestamp
- 23. incompatibilidad PHP MySQL
- 24. Jquery ordenable ('serialize')
- 25. Serialize enum como int
- 26. Serialize Composed Func?
- 27. jQuery serialize no funciona
- 28. Serialize árbol prefijo
- 29. Datos binarios en MySQL
- 30. datos jerárquicos en MySQL
¡Gracias por su respuesta y recomendaciones, ha sido muy útil! – alejoabella
Como los datos serializados de PHP devuelven datos binarios, no use VARCHAR o TEXT, sino VARBINARIO o BLOB. –