Ver Mensaje Individual
  #7 (permalink)  
Antiguo 26/01/2012, 14:12
Avatar de GatorV
GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: PDO e inyección SQL

El que uses named parameters (:name) o placeholders (?) es lo mismo, debes de entender como funcionan los prepared statements para que veas como es que te protegen de los SQL Inyections.

Cuando tu mandas un query, por ejemplo SELECT * FROM foo WHERE bar = ?, este query como tal, literal se envía a MySQL (con todo y el ?), el motor de MySQL analiza el query, y ve el placeholder y dice "ok espero una variable de entrada", entonces ejecuta el query y lo deja en un estado compilado, luego PDO al hacer el execute, le dice del query que te envié, estos son los parámetros, y entonces hace la ejecución del Query.

Esto hace que sea imposible que te hagan SQL Inyection, ya que el SQL no existe, ya se volvió código nativo para la base de datos que solo espera variables de entrada, las cuales por más SQL que pongan no tiene efecto ya que son variables.

Si entiendes esto, puedes ver la razón de porque usando ? o :name es lo mismo, y realmente solo es a tu gusto como programador el usar cualquiera de las dos.

También viendo esto puedes ver el porque no se puede usar el NOW() como variable, y se tiene que construir directamente en el query.

También puedes ver con esto porque no se puede hacer algo así: SELECT * FROM ? WHERE ? = ?, ya que MySQL analiza y prepara el Query y no soporta variables en esas posiciones, solo en las variables de entrada.

Saludos.