Ver Mensaje Individual
  #1 (permalink)  
Antiguo 13/12/2011, 12:07
refreegrata
 
Fecha de Ingreso: agosto-2008
Mensajes: 198
Antigüedad: 15 años, 9 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.