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.
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