Comprender el escape de entrada en PHP

Una cosa que siempre me ha confundido es el escaneo de entradas y si estás o no protegido de ataques como la inyección de SQL.

Digamos que tengo un formulario que envía datos usando HTTP POST a un archivo PHP. Escribo lo siguiente en un campo de entrada y envío el formulario:

"Hello", said Jimmy O'Toole. 

Si imprime / repite la entrada en la página PHP que recibe esta información POST, se obtiene como:

 \"Hello\", said Jimmy O\'Toole. 

Este es el punto donde se vuelve confuso. Si pongo esta cadena de entrada en (Mi) SQL y la ejecuto, entrará bien en la base de datos (ya que las comillas se han escapado), pero ¿eso detendría la inyección de SQL?

Si tomo la cadena de entrada y llamo mysqli real_escape_string , aparece así:

 \\"Hello\\", said Jimmy O\\'Toole. 

Entonces, cuando ingresa a la base de datos a través de (My) SQL, termina como:

 \"Hello\", said Jimmy O\'Toole. 

Esto obviamente tiene demasiadas barras.

Entonces, si la entrada proviene de HTTP POST como escapado, ¿tiene que volver a escapar para que sea seguro para (My) SQL? ¿O simplemente no veo algo obvio aquí?

Gracias de antemano por cualquier ayuda.

Ah, las maravillas de las citas de magia . Está haciendo esos escapes innecesarios de tus formularios POST. Debes desactivarlos (o neutralizarlos) y muchos de tus dolores de cabeza desaparecerán.

Aquí hay un artículo ejemplar del tema: http://www.sitepoint.com/blogs/2005/03/02/magic-quotes-headaches/

Recapitulación: deshabilite las comillas mágicas, use real_escape_string() .

En lugar de confiar en escapar, usaría consultas SQL parametrizadas y dejaría que el controlador mysql hiciera lo que fuera necesario para escaparse.

Parece que tu servidor PHP tiene habilitada la función de Cotizaciones Mágicas , de ahí viene tu primer conjunto de barras. En teoría, entonces debería ser innecesario llamar a las funciones de escape, pero cuando la aplicación se ejecuta en un servidor con comillas mágicas desactivadas, de repente estás abierto a la inyección de SQL mientras piensas que no lo eres.

Como escribió Chakrit, escapar no es la mejor manera de protegerse: es mucho más seguro para las consultas parametrizadas por el usuario.

Lo que sucede es que tienes Magic Quotes activadas en tu configuración de PHP.

Es muy recomendable que desactives las comillas mágicas, de hecho, han sido eliminadas por completo de PHP 6.

Una vez que deshabilite las comillas mágicas, verá que el texto POST devuelto exactamente como lo escribió en el formulario: "Hello", said Jimmy O'Toole. Ahora es obvio que necesita usar las funciones de escape de mysql o incluso las declaraciones mejor preparadas (con las declaraciones preparadas no puede olvidar escaparse de una cadena como se hace para usted).

Obvio es la palabra clave para un hacker.

Creo que escaparse normalmente debería ser suficiente, pero proteger contra solo las citas podría no ser suficiente.

Vea esta hoja de prueba de SQL Injection , es una buena lista de pruebas que puede ejecutar y ver si demasiados slahses son algo bueno o no.

Y no se olvide de escapar también de otros tipos de valores, es decir, los campos numéricos y los campos de fecha y hora pueden inyectarse con la misma facilidad que las cadenas.