ventajas stmt statement sentencias query prepared preparadas desventajas consultas php pdo

php - stmt - sentencias preparadas ventajas y desventajas



¿Las declaraciones preparadas de PHP DOP deben ser evitadas? (5)

DOP no escapa a las variables. Las variables y el comando SQL se transfieren de forma independiente a través de la conexión MySQL. Y el tokenizador de SQL (analizador) nunca mira los valores . Los valores solo se copian literalmente en el almacenamiento de la base de datos sin la posibilidad de causar daños. Es por eso que no hay necesidad de reunir los datos con declaraciones preparadas.

Tenga en cuenta que esto es principalmente una ventaja de velocidad. Con mysql_real_escape_string (), primero calcula las variables en PHP, luego envía un comando SQL ineficiente al servidor, lo que tiene que separar costosamente el comando SQL real de los valores nuevamente. Es por eso que a menudo se dice que la ventaja de seguridad es solo implícita, no la razón principal para usar PDO.

Si concatena el comando SQL y no usa realmente las declaraciones preparadas (¡no es bueno!), Entonces sí, todavía hay una función de escape para PDO: $pdo->quote($string)

En la DOP :: Preparar página dice:

"y ayuda a prevenir ataques de inyección SQL al eliminar la necesidad de cotizar manualmente los parámetros"

Sabiendo esto, ¿hay una función de PHP como mysql_real_escape_string () que se encarga de escapar de las picaduras de la DOP? ¿O es que la DOP se encarga de que se me escape todo?

EDITAR

Me doy cuenta ahora que hice la pregunta equivocada. Mi pregunta realmente fue: "¿De qué se ocupa todo PDO por mí?" Lo cual me doy cuenta ahora con estas respuestas de que realmente solo elimina la necesidad de escapar de las comillas. Pero aún tendría que hacer cualquier otra llamada de PHP en los valores que paso a la función de ejecución. Como htmlentities (), strip_tags () ... etc ...


Muy pocas personas aquí entienden qué es escapar y cuándo usarlo.
El escape en sí mismo no hace ningún dato "seguro". simplemente se escapa de los delimitadores, para distinguir un delimitador de una parte de los datos. field = ''it''s me'' causará un error, mientras que field = ''it/'s me'' no lo hará. Ese es el único propósito de escapar. Por lo tanto, funciona solo cuando usas comillas. Si no lo haces, escapar se volverá inútil.

¿Usas citas con marcadores de posición? No. Por lo tanto, ningún escape sería sensato.

Cuando usas el enlace, funciona de manera muy diferente.
No envía la consulta completa al servidor, pero envía su consulta preparada por separado de los datos vinculados. Así que no puede interferir. Y así no es posible la inyección.


No tienes que preocuparte por eso. DOP no requiere que escape sus datos antes de pasarlos a la base de datos.

Edición: para que quede claro, quiero decir que mientras esté pasando variables a sus parámetros (por ejemplo, el valor de un campo de formulario), no tiene que preocuparse por eso. Sin embargo, si está pasando variables que ha definido como cadenas, por ejemplo, obviamente necesita escapar de cualquier cosa que necesite escapar en esa cadena para evitar romper la sintaxis. Sin embargo, esto no tendría mucho sentido, ya que una de las principales ventajas de PDO es que está pasando información del usuario a la base de datos sin tener que desinfectarla, y no hay muchas veces (¿alguna?) que estarías pasando cuerdas que tú mismo habías definido.

Además, asegúrese de que todavía desinfecte sus datos para el tipo . Por ejemplo, asegúrate de que sea un entero si esperas que sea, asegúrate de que sea menor o mayor que x si esperas que sea, etc.


Si prepara una declaración y usa bindParam o bindValue para suministrar variables, no necesita escapar de las variables. Tenga en cuenta que estas funciones suponen que la variable contiene una cadena, así que use el tercer parámetro para bindValue si desea usar valores booleanos o flotantes.


Si y no:

  • Los literales que incruste en la cadena de instrucción deben escaparse de la forma habitual.
  • Los valores que enlaza con la instrucción preparada son manejados por la biblioteca.