2008-09-05 6 views
7

Estas son algunas de las posibilidades para iniciar la conversación:¿Cómo se evita la inyección de SQL en las aplicaciones LAMP?

  1. escape todas las entradas en la inicialización.
  2. Escapar cada valor, preferentemente al generar el SQL.

La primera solución es subóptima, porque luego necesita volver a separar cada valor si desea usarlo en algo que no sea SQL, como la salida en una página web.

La segunda solución tiene mucho más sentido, pero escalar manualmente cada valor es un problema.

Conozco prepared statements, pero encuentro MySQLi engorroso. Además, me preocupa la separación de la consulta de las entradas, porque aunque es crucial para corregir el orden, es fácil cometer un error y, por lo tanto, escribir los datos incorrectos en los campos incorrectos.

Respuesta

7

como estados de @Rob Walker, las consultas parametrizadas son su mejor opción. Si está utilizando el último y mejor PHP, le recomiendo echar un vistazo a PDO (Objetos de datos PHP). Esta es una biblioteca de abstracción de base de datos nativa que tiene soporte para una amplia gama de bases de datos (incluido MySQL por supuesto), así como también declaraciones preparadas con parámetros nombrados.

10

Las declaraciones preparadas son la mejor respuesta. ¡Tienes pruebas porque puedes cometer errores!

Ver this pregunta.

-1

Siempre utilicé la primera solución porque el 99% de las veces, las variables en $_GET, $_POST y $_COOKIE nunca se envían al navegador. Además, nunca escribirás código por error con una inyección SQL (a menos que no uses comillas en la consulta), mientras que con la segunda solución podrías olvidarte fácilmente de escapar de una de tus cadenas eventualmente.

En realidad, la razón por la que siempre lo hice así fue porque todos mis sitios tenían la configuración magic_quotes activada de manera predeterminada, y una vez que ha escrito mucho código usando una de esas dos soluciones, se necesita mucho de trabajo para cambiar a la otra.

1

Me gustaría ir con el uso de declaraciones preparadas. Si desea utilizar declaraciones preparadas, probablemente desee verificar las funciones de PDO para PHP. Esto no solo le permite ejecutar declaraciones preparadas fácilmente, sino que también le permite ser un poco más agnóstico de la base de datos al no llamar a funciones que comienzan con mysql_, mysqli_ o pgsql_.

0

PDO puede valer la pena algún día, pero aún no está allí. Es un DBAL y su fuerza (supuestamente) es facilitar el cambio entre proveedores. No es realmente construir para atrapar inyecciones de SQL.

De todos modos, desea escapar y sanatize sus entradas, utilizando declaraciones preparadas podría ser una buena medida (lo aseguro). Aunque creo que es mucho más fácil, p. utilizando filter.

Cuestiones relacionadas