Solución:
Bueno, no, ¡no hay ninguno!
Técnicamente hay PDO::quote()
pero rara vez se usa y no es el equivalente de mysql_real_escape_string()
¡Eso es correcto! Si ya está utilizando PDO de la forma correcta, según lo documentado, utilizando declaraciones preparadas, lo protegerá de la inyección de MySQL.
# Example:
A continuación se muestra un ejemplo de a salvo consulta de base de datos utilizando declaraciones preparadas (pdo)
try {
// first connect to database with the PDO object.
$db = new PDO("mysql:host=localhost;dbname=xxx;charset=utf8", "xxx", "xxx", [
PDO::ATTR_EMULATE_PREPARES => false,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
} catch(PDOException $e){
// if connection fails, show PDO error.
echo "Error connecting to mysql: " . $e->getMessage();
}
Y, ahora asumiendo que la conexión está establecida, puede ejecutar su consulta de esta manera.
if($_POST && isset($_POST['color'])){
// preparing a statement
$stmt = $db->prepare("SELECT id, name, color FROM Cars WHERE color = ?");
// execute/run the statement.
$stmt->execute(array($_POST['color']));
// fetch the result.
$cars = $stmt->fetchAll(PDO::FETCH_ASSOC);
var_dump($cars);
}
Ahora, como probablemente pueda ver, no he usado nada para escapar / desinfectar el valor de $_POST["color"]
. Y este código está protegido de myql-injection gracias a PDO y al poder de las declaraciones preparadas.
Vale la pena señalar que debe aprobar un charset=utf8
como atributo, en tu DSN
como se vio anteriormente, por razones de seguridad, y siempre habilite PDO para mostrar errores en forma de excepciones.
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
por lo que los errores de las consultas de su base de datos no revelarán datos confidenciales como la estructura de su directorio, el nombre de usuario de la base de datos, etc.
Por último, pero no menos importante, hay momentos en los que no debe confiar en PDO al 100%, y estará obligado a tomar algunas medidas adicionales para evitar la inyección de sql, uno de esos casos es, si está utilizando una versión desactualizada de mysql [ mysql =< 5.3.6 ]
como se describe en esta respuesta
Pero, usar declaraciones preparadas como se muestra arriba siempre será más seguro que usar cualquiera de las funciones que comienzan con mysql_
Buenas lecturas
Tutorial de PDO para desarrolladores de MySQL
No hay ninguno*! El objetivo de la DOP es que no tengas que escapar de nada; simplemente lo envía como datos. Por ejemplo:
$query = $link->prepare('SELECT * FROM users WHERE username = :name LIMIT 1;');
$query->execute([':name' => $username]); # No need to escape it!
Opuesto a:
$safe_username = mysql_real_escape_string($username);
mysql_query("SELECT * FROM users WHERE username="$safe_username" LIMIT 1;");
* ¡Bueno, hay uno, como dijo Michael Berkowski! Pero hay mejores formas.
$v = '"'.mysql_real_escape_string($v).'"';
es el equivalente de $v = $this->db->quote($v);
asegúrese de tener una instancia de PDO en $this->db
para que puedas llamar al método pdo quote()