sql >> Base de Datos >  >> RDS >> Mysql

¿Debería usar declaraciones preparadas solo para su escape?

La diferencia se considera insignificante.

Sin embargo, hay que distinguir declaraciones preparadas nativas de la idea general de una declaración preparada.

El primero es solo una forma de ejecutar consultas admitidas por la mayoría de DBMS, explicado aquí . Su uso puede ser cuestionado.
Este último es una idea general de sustituir los datos reales con un marcador de posición, lo que implica un procesamiento posterior de los datos sustituidos. Es ampliamente utilizado en programación, un conocido printf() La función es un ejemplo. Y este último enfoque debe usarse SIEMPRE para ejecutar una consulta en una base de datos , sin importar si está respaldado por declaraciones preparadas nativas o no. porque:

  • la declaración preparada hace que el formato (o el manejo) sea inevitable .
  • la declaración preparada tiene el formato (o manejo) adecuado en el único lugar adecuado - justo antes de la ejecución de la consulta, no en otro lugar, por lo que nuestra seguridad no dependerá de fuentes tan poco confiables como
    • alguna característica 'mágica' de PHP que estropea los datos en lugar de hacerlos seguros.
    • buena voluntad de uno (o varios) programadores, que pueden decidir formatear (o no formatear) nuestra variable en algún lugar del flujo del programa. Ese es el punto de gran importancia.
  • la declaración preparada afecta el valor mismo que se incluye en la consulta, pero no la variable de origen, que permanece intacta y puede usarse en el código adicional (para enviarse por correo electrónico o mostrarse en pantalla).
  • la declaración preparada puede hacer que el código de la aplicación sea mucho más corto, haciendo todo el formato detrás de escena (*solo si el controlador lo permite).

Por lo tanto, incluso si considera no usar declaraciones preparadas nativas (lo cual está bastante bien), siempre debe crear sus consultas usando marcadores de posición en lugar de los datos reales. Para ello, puede utilizar PDO , que funciona exactamente como se describió anteriormente; de ​​forma predeterminada, simplemente emula los preparativos , significa que se crea una consulta SQL regular a partir de consultas y datos preparados, y luego se ejecuta en la base de datos.

Sin embargo, PDO carece de soporte para muchos tipos de datos importantes, como un identificador o una matriz; por lo tanto, no puede usar siempre marcadores de posición y, por lo tanto, hace que una inyección sea bastante posible. Por suerte, safeMysql tiene marcadores de posición para cada tipo de datos y le permite ejecutar consultas de forma segura.