Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

[SOLUCIONADO] PDO e inyección SQL

Estas en el tema de PDO e inyección SQL en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Si yo tengo una consulta con PDO asi: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original SELECT * FROM una_tabla WHERE campo = ? Tambien estoy evitando ...
  #1 (permalink)  
Antiguo 26/01/2012, 12:56
Avatar de jotaincubus  
Fecha de Ingreso: mayo-2005
Ubicación: Medellin - Colombia
Mensajes: 1.797
Antigüedad: 18 años, 11 meses
Puntos: 394
PDO e inyección SQL

Si yo tengo una consulta con PDO asi:

Código MySQL:
Ver original
  1. SELECT * FROM una_tabla WHERE campo = ?

Tambien estoy evitando la inyección SQL como en named parameters ?

Código MySQL:
Ver original
  1. SELECT * FROM una_tabla WHERE campo = :parametro

Muchas gracias por sus respuestas.
__________________
Por que existe gente que no agradece después de que se le ha brindado tiempo y ayuda ???
  #2 (permalink)  
Antiguo 26/01/2012, 12:59
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 8 meses
Puntos: 1532
Respuesta: PDO e inyección SQL

en esencia sí, PDO al preparar realiza escapado de variables, pero nada cuesta probar un poco, trata de agregar algo con comillas, si no falla la consulta y se ve la comilla en DB no tiene que preocuparse de ese aspecto
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #3 (permalink)  
Antiguo 26/01/2012, 13:13
Avatar de jotaincubus  
Fecha de Ingreso: mayo-2005
Ubicación: Medellin - Colombia
Mensajes: 1.797
Antigüedad: 18 años, 11 meses
Puntos: 394
Respuesta: PDO e inyección SQL

jeje muchas gracias por tu respuesta, imagínate que intente haciendo esto:

Código PHP:
Ver original
  1. $array = array('NOW()')
  2. // codigos de PDO aquí
  3. prepare("INSERT INTO una_tabla (campo) VALUES (?)")
  4. execute($array)

Y no me dejo, me toco hacer esto:

Código PHP:
Ver original
  1. $fecha = date("d/m/Y h:i:s")
  2. $array = array($fecha)
  3. // codigos de PDO aquí
  4. prepare("INSERT INTO una_tabla (campo) VALUES (?)")
  5. execute($array)

Según eso si evitaría la inyección SQL no ?
__________________
Por que existe gente que no agradece después de que se le ha brindado tiempo y ayuda ???
  #4 (permalink)  
Antiguo 26/01/2012, 13:23
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 8 meses
Puntos: 1532
Respuesta: PDO e inyección SQL

bueno, en el caso de fechas, PDO te exige un objeto fecha (lógico es orientado a objetos), pero en el caso de cadenas si las escapa, eso quiere decir que PDO restringe por tipos, eso es muy apreciado en el caso de seguridad
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #5 (permalink)  
Antiguo 26/01/2012, 13:30
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: PDO e inyección SQL

Lo que pasa es que al usar ? como placeholder, PDO lo escapa y tu consulta queda así:
Código SQL:
Ver original
  1. INSERT INTO una_tabla (campo) VALUES ('NOW()')

Tienes que entender que la idea de usar prepared statements, no es solamente la de escapar los carácteres, si no más bien lo que hace internamente PDO es mandar el query a tu BDD, compilar el query y luego esperar los valores de entrada.

Es por eso que no se pueden poner funciones como NOW() ya que no hay optimización, en ese caso ponlo directamente en tu query:

Código SQL:
Ver original
  1. INSERT INTO TABLE (campo) VALUES (NOW())

La idea de usar prepared statements es de usarlos cuando necesites enviar variables de entrada o salida y tener la mayor optimización posible.

Saludos.
  #6 (permalink)  
Antiguo 26/01/2012, 14:04
Avatar de jotaincubus  
Fecha de Ingreso: mayo-2005
Ubicación: Medellin - Colombia
Mensajes: 1.797
Antigüedad: 18 años, 11 meses
Puntos: 394
Respuesta: PDO e inyección SQL

Muchas gracias por responder GatorV, pero volviendo a la pregunta inicial con cualquiera de las dos formas PDO me evita inyecciones SQL?

Es que estube buscando y encontre en el foro un tema viejo pero se utiliza "named parameters", mi pregunta concreta es si utilizando "positional parameters" PDO también me evita inyección SQL ?
__________________
Por que existe gente que no agradece después de que se le ha brindado tiempo y ayuda ???
  #7 (permalink)  
Antiguo 26/01/2012, 14:12
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
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.
  #8 (permalink)  
Antiguo 26/01/2012, 14:21
Avatar de jotaincubus  
Fecha de Ingreso: mayo-2005
Ubicación: Medellin - Colombia
Mensajes: 1.797
Antigüedad: 18 años, 11 meses
Puntos: 394
Respuesta: PDO e inyección SQL

O.o ahora si entendí, ahora se como funciona, es una excelente respuesta.... Como siempre GatorV te sobraste con esa explicación.

Si PDO hace todo eso para evitar la inyección, entonces para que utilizar bindParam ? Es que leo y leo y busco y busco y no dicen la funcion real de bindParam

Muchísimas gracias.
__________________
Por que existe gente que no agradece después de que se le ha brindado tiempo y ayuda ???
  #9 (permalink)  
Antiguo 27/01/2012, 09:47
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: PDO e inyección SQL

No es que lo haga PDO, de hecho es un trabajo del RDBMS, aunque PDO trae una capa que emula los prepared statements si es que el RDBMS no soporta eso.

bindParam, sirve para enlazar una variable (por referencia) hacía un prepared statement, te permite hacer cosas así:
Código PHP:
Ver original
  1. $stmt = $pdo->prepare('INSERT INTO colors (color) VALUES (?)');
  2. $stmt->bindParam(1, $color, PDO::PARAM_STR);
  3.  
  4. $color = 'black';
  5. $stmt->execute(); // se inserta black
  6.  
  7. $color = 'blue';
  8. $stmt->execute(); // se inserta blue

O sea la variable queda enlazada por referencia, y sirve para poder también usar variables de entrada y salida en los stored procedures. Un ejemplo del manual:
Código PHP:
Ver original
  1. $colour = 'red';
  2. $sth = $pdo->prepare('CALL puree_fruit(?)');
  3. $sth->bindParam(1, $colour, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 12);
  4. $sth->execute();
  5. print("After pureeing fruit, the colour is: $colour"); // imprime otra cosa que no es red ya que fue cambiada en el stored procedure

Los prepared statements son muy usados sobre todo cuando tienes que hacer muchos inserts (en modo batch) ya que tienen el mejor rendimiento vs usar sql queries normales.

Saludos.
  #10 (permalink)  
Antiguo 27/01/2012, 14:14
Avatar de jotaincubus  
Fecha de Ingreso: mayo-2005
Ubicación: Medellin - Colombia
Mensajes: 1.797
Antigüedad: 18 años, 11 meses
Puntos: 394
Respuesta: PDO e inyección SQL

Perfecto, queda completamente aclarada mi duda. Nuevamente muchísimas gracias por la explicación.
__________________
Por que existe gente que no agradece después de que se le ha brindado tiempo y ayuda ???

Etiquetas: inyección, pdo, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:57.