Foros del Web » Programando para Internet » PHP »

PDO, prevención de inyección SQL, escape de caracteres

Estas en el tema de PDO, prevención de inyección SQL, escape de caracteres en el foro de PHP en Foros del Web. Hola foreros. Tengo una duda. Hasta el momento para trabajar con bases de datos usaba las funciones específicas ofrecidas para el motor elegido. Por ejemplo ...
  #1 (permalink)  
Antiguo 13/12/2011, 12:07
 
Fecha de Ingreso: agosto-2008
Mensajes: 198
Antigüedad: 15 años, 8 meses
Puntos: 27
PDO, prevención de inyección SQL, escape de caracteres

Hola foreros. Tengo una duda. Hasta el momento para trabajar con bases de datos usaba las funciones específicas ofrecidas para el motor elegido. Por ejemplo para Postgresql.
Código:
$param = (get_magic_quotes_gpc())?stripslashes($_POST['param']):$_POST['param'];
$sql = 'SELECT * FROM tabla WHERE nombre='.pg_escape_string($param);
pg_query($sql) or die('Consulta fallida: ' . pg_last_error());
Con Postgresql, para prevenir inyecciones SQL usaba la función "pg_escape_string", la cual escapa los caracteres peligrosos. Antes de aplicar dicha función yo siempre realizaba, en caso de tener "magic quotes" activo, un stripslashes, para después escapar con la función especifica. Algo como:
Código:
$param = (get_magic_quotes_gpc())?stripslashes($_POST['param']):$_POST['param'];
Evitando que así que se escape 2 veces.

El tema es que ahora quiero empezar a trabajar con PDO. Mi duda es ¿Debo igualmente evaluar "magic quotes" para ver si aplicar un stripslashes antes de usar las funciones de escape de PDO ("quote" o "bindParam", en caso de usar "prepare")?

Yo creo que no es necesario. Que las funciones de PDO se encargan de dicha comprobación por sí solas, pero no tengo seguridad de ello. Espero que alguien me pueda decir.

En otras palabras, ¿con esto me bastaría, y me aseguraría de prevenir errores como escapes dobles (que los parámetros quedasen de la forma 'aa\\' en vez de 'aa\'a')?
Código:
$param = $_POST['param'];
$sql = 'SELECT * FROM tabla WHERE nombre='.$dbh->quote($param);
$results = $dbh->query($sql);
o con "prepare"
Código:
$param = $_POST['param'];
$sql = 'SELECT * FROM tabla WHERE nombre=:nombre';
$stmt = $dbh->prepare($sql);
$stmt->setFetchMode(PDO::FETCH_OBJ);
$stmt->bindParam(':nombre', $param,PDO::PARAM_STR);
$stmt->execute();
$results = $stmt->fetchAll();
Saludos.
  #2 (permalink)  
Antiguo 13/12/2011, 12:28
Avatar de emiliodeg  
Fecha de Ingreso: septiembre-2005
Ubicación: Córdoba
Mensajes: 1.830
Antigüedad: 18 años, 7 meses
Puntos: 55
Respuesta: PDO, prevención de inyección SQL, escape de caracteres

la mejor solución es como primer medida sacar de la configuración de php el escape automatico
como segundo punto utilizar el statment de mysql
y bueno si sos fanatico un poco de procesimientos almacenados y listo

despues la regla de oro "filtrar los datos que entran y escapar los que salen"

espero te sirva
__________________
Degiovanni Emilio
developtus.com
  #3 (permalink)  
Antiguo 13/12/2011, 12:45
 
Fecha de Ingreso: agosto-2008
Mensajes: 198
Antigüedad: 15 años, 8 meses
Puntos: 27
Respuesta: PDO, prevención de inyección SQL, escape de caracteres

Cita:
Iniciado por emiliodeg Ver Mensaje
la mejor solución es como primer medida sacar de la configuración de php el escape automatico
como segundo punto utilizar el statment de mysql
y bueno si sos fanatico un poco de procesimientos almacenados y listo

despues la regla de oro "filtrar los datos que entran y escapar los que salen"

espero te sirva
Gracias por responder. Disculpa si estoy un poco lerdo, pero no entendí del todo lo que dijiste. Lo de desactivar "magic quotes" en la configuración, pues no puedo, ya que no soy el administrador del equipo en donde se alojará la aplicación. Por otro lado, uso PostgreSQL, no MySQL. Supongo que con eso te referías a usar las específicas del motor. Pero la verdad es que me gustaría trabajar con PDO, para obtener una cierta independencia del motor escogido.

Lo que no sé es si debo o no hacer un stripslashes (en caso del magic quotes activo) antes de pasar los parámetros, puesto que no tengo idea si PDO evalúa esto con sus propias funciones o no. Según lo veo, lo que se podría generar es un doble escape o por el contrario, un doble stripslashes ¿Vez mi duda? ¿es por esto que debo saber si PDO evalúa el "magic quotes" o yo debo hacerlo antes?

Saludos.
  #4 (permalink)  
Antiguo 13/12/2011, 14:10
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, prevención de inyección SQL, escape de caracteres

Lamentablemente sí tienes que comprobar usando get_magic_quotes_gpc(), y lo mejor es usar el prepare de PDO, ya que así garantizas un mejor escape a construir manualmente el query.
  #5 (permalink)  
Antiguo 13/12/2011, 14:21
 
Fecha de Ingreso: agosto-2008
Mensajes: 198
Antigüedad: 15 años, 8 meses
Puntos: 27
Respuesta: PDO, prevención de inyección SQL, escape de caracteres

Cita:
Iniciado por GatorV Ver Mensaje
Lamentablemente sí tienes que comprobar usando get_magic_quotes_gpc(), y lo mejor es usar el prepare de PDO, ya que así garantizas un mejor escape a construir manualmente el query.
OK, gracias por responder, ya entendí. Si el magic_quotes está en on, antes de todo deberé aplicar el stripslashes.

Saludos.
  #6 (permalink)  
Antiguo 13/12/2011, 14:32
 
Fecha de Ingreso: agosto-2011
Mensajes: 161
Antigüedad: 12 años, 8 meses
Puntos: 7
Respuesta: PDO, prevención de inyección SQL, escape de caracteres

La mejor opcion es statement !
Recuerda siempre antes de la impresion convertir a entidades.
saludos!

Etiquetas: caracteres, escape, inyección, pdo, sql, tabla
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 05:45.