2010-06-23 26 views
6

Actualmente estoy usando la extensión mysqli php.declaraciones preparadas de mysqli y mysqli_real_escape_string

Tradicionalmente I han utilizado mysqli_real_escape_string para escapar de la entrada del usuario. Sin embargo, estoy buscando cambiar el código (con suerte en los pocos pasos posibles) para usar declaraciones preparadas.

Quiero ser claro en esto - siempre y cuando yo utilizo declaraciones preparadas para prender a todos de mi variables, puedo estar seguro de que la inyección de SQL es imposible? (Y prescindir totalmente de mysqli_real_escape_string?)

Gracias

Respuesta

5

Si enlaza correctamente todas las variables se puede reducir drásticamente el riesgo de inyección SQL. Todavía es posible conseguir una inyección de SQL si crea SQL de forma dinámica, por ejemplo:

'SELECT * FROM ' . $tablename . ' WHERE id = ?' 

Pero si se evita cosas como esta no es probable va a tener problemas.

+0

Sí, consulte http://www.sjmp.de/php/php-mysql-mehr-sicherheit-und-erhoehte-performance-durch-mysqli-und-prepared-statements/ para obtener más información – Tobias

4

Hablando de seguridad, no hay ninguna diferencia entre ambos métodos, si enlaza o formatear sus variables correctamente.

unión es apenas más simples, ya que puede ser utilizado sólo para cualquier caso, mientras que escapar no puede (así, tienen que desechar algunas variables en vez de escapar/citar).

Además, tenga en cuenta que ningún enlace ni escape puede hacer que el identificador sea seguro. Entonces, si tiene que usar un nombre de campo u operador en su consulta, debe usar un valor codificado en su script.

2

Aquí está mi vista de alto nivel sobre el tema.

Al utilizar cadenas de SQL dinámico, que están confiando en la función de escape de funcionar correctamente. Por desgracia, este no es siempre el caso, como se puede ver en esta (la verdad de edad) ejemplo:

http://dev.mysql.com/doc/refman/5.0/en/news-5-0-22.html

Una vez que los valores de los datos se han escapado, la cadena SQL tiene que ser analizado y compilado por la base de datos servidor. Si la función de escape no ha hecho su trabajo correctamente o si se ha descubierto un nuevo ataque inteligente de inyección SQL, existe la posibilidad de que el servidor confunda los datos con las declaraciones SQL.

Si usa comandos preparados con estos parámetros, la declaración se analiza y se compilan en primer lugar. Los valores de los datos se combinan con la declaración compilada cuando se ejecuta. Esto separa la lógica de SQL de los valores de datos: la oportunidad de confundir los dos nunca debería ocurrir.

Así que, sí, puede prescindir de mysqli_real_escape_string, pero no iría tan lejos como para decir que el uso de declaraciones preparadas con parámetros hace que la inyección de SQL sea imposible. Lo hace significativamente más difícil, pero como con el error mysqli_real_escape_string, creo que siempre existe la posibilidad de que un error por descubrir (o creado recientemente) haga lo aparentemente imposible, posible.

Cuestiones relacionadas