Bem, não, não há nenhum!
Tecnicamente existe
PDO::quote()
mas raramente é usado e não é equivalente a mysql_real_escape_string()
Isso mesmo! Se você já estiver usando o PDO da maneira correta, conforme documentado usando declarações preparadas , então ele irá protegê-lo da injeção do MySQL.
# Example:
Abaixo está um exemplo de um seguro consulta de banco de dados usando instruções 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();
}
E, agora supondo que a conexão esteja estabelecida, você pode executar sua consulta assim.
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);
}
Agora, como você provavelmente pode dizer, eu não usei nada para escapar/limpar o valor de
$_POST["color"]
. E este código está protegido contra myql-injection graças ao PDO e ao poder das declarações preparadas. Vale a pena notar que você deve passar um
charset=utf8
como atributo, em seu DSN
como visto acima, por questões de segurança, e sempre habilite o PDO para mostrar erros na forma de exceções. PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
para que os erros de suas consultas de banco de dados não revelem dados confidenciais, como sua estrutura de diretórios, nome de usuário do banco de dados etc.
Por último, mas não menos importante, há momentos em que você não deve confiar no PDO 100%, e será obrigado a tomar algumas medidas extras para evitar a injeção de sql, um desses casos é, se você estiver usando uma versão desatualizada do mysql
[ mysql =< 5.3.6 ]
como descrito em esta resposta
Mas, usar instruções preparadas como mostrado acima sempre será mais seguro do que usar qualquer uma das funções que começam com
mysql_
Boas leituras