¿Necesito usar mysql_real_escape_string()
en mi entrada (como $_POST
y $_GET
) cuando uso la biblioteca PDO?¿Cómo desinfecta la entrada con PDO?
¿Cómo escapo correctamente la entrada del usuario con PDO?
¿Necesito usar mysql_real_escape_string()
en mi entrada (como $_POST
y $_GET
) cuando uso la biblioteca PDO?¿Cómo desinfecta la entrada con PDO?
¿Cómo escapo correctamente la entrada del usuario con PDO?
Si usa PDO puede parametrizar sus consultas, eliminando la necesidad de evitar cualquier variable incluida.
Consulte here para obtener un excelente tutorial introductorio para PDO.
Usando PDO puede separar el SQL y los parámetros pasados usando declaraciones preparadas, esto elimina la necesidad de escanear cadenas, ya que los dos se mantienen por separado y luego combinados en la ejecución, los parámetros se manejan automáticamente como picaduras, de la fuente anterior :
// where $dbh is your PDO connection
$stmt = $dbh->prepare("SELECT * FROM animals WHERE animal_id = :animal_id AND animal_name = :animal_name");
/*** bind the paramaters ***/
$stmt->bindParam(':animal_id', $animal_id, PDO::PARAM_INT);
$stmt->bindParam(':animal_name', $animal_name, PDO::PARAM_STR, 5);
/*** execute the prepared statement ***/
$stmt->execute();
Nota: la desinfección se produce durante la unión ($stmt->bindParam
)
Otros recursos variables:
http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/
http://www.phpeveryday.com/articles/PDO-Prepared-Statement-P550.html
El punto importante cuando se utiliza PDO es:
DOP sólo desinfectar para SQL, no para su aplicación.
Así que sí, para escrituras, como INSERTAR o ACTUALIZAR, es especialmente crítico filtrar primero sus datos y desinfectarlos para otras cosas (eliminación de etiquetas HTML, JavaScript, etc.).
<?php
$pdo = new PDO(...);
$stmt = $pdo->prepare('UPDATE users SET name = :name WHERE id = :id');
$id = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT); // <-- filter your data first
$name = filter_input(INPUT_GET, 'name', FILTER_SANITIZE_STRING); // <-- filter your data first
$stmt->bindParam(':id', $id, PDO::PARAM_INT); // <-- Automatically sanitized for SQL by PDO
$stmt->bindParam(':name', $name, PDO::PARAM_STR); // <-- Automatically sanitized for SQL by PDO
$stmt->execute();
Sin desinfectar la entrada del usuario, un hacker podría haber salvado algunos javascript en su base de datos y luego, cuando la producción en su sitio que se habría expuesto a una amenaza!
Hola gracias. Ya lo sé, así que no necesito $ animal_id = mysql_real_escape_string ($ _ POST ['blabla']), ¿pero ahora puedo hacer $ animal_id = $ _ POST ['blabla'] ahora? – Karem
Si está utilizando una declaración preparada, puede vincular directamente la variable sin la necesidad de escaparla como una cadena ... usando PDO, la ejecuta/maneja como una cadena de todos modos, evitando que cualquier inyección intente – SW4
Entonces, para más simple responde, si! – SW4