Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Qual é o equivalente PDO da função mysql_real_escape_string?


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

Tutorial PDO para desenvolvedores MySQL