Что такое PDO-эквивалент функции mysql real escape string?

Я изменяю свой код с помощью mysql_* до PDO. В моем коде было mysql_real_escape_string(). Что эквивалентно этому в PDO?

5 ответов


Ну нет, нет!

технически нет PDO::quote() но он редко когда-либо используется и не является эквивалентом mysql_real_escape_string()

правильно! если вы уже используете PDO надлежащим образом, как описано с помощью подготовленные заявления, тогда он защитит вас от инъекции MySQL.


# Example:

ниже пример безопасное запрос базы данных с использованием подготовленных операторов (pdo)

  try {
     // first connect to database with the PDO object. 
     $db = new \PDO("mysql:host=localhost;dbname=xx;charset=utf8", "xx", "xx", [
       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();
 }

и, теперь предполагая, что соединение установлено, вы можете выполнить свой запрос следующим образом.

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); 
 }

теперь, как вы, вероятно, можете сказать, я ничего не использовал, чтобы избежать / санировать значение $_POST["color"]. И этот код защищен от myql-инъекции благодаря PDO и силе подготовленных операторов.


стоит отметить, что вы должны пройти charset=utf8 как атрибут, в вашем DSN как видно выше, по соображениям безопасности, и всегда позволяют PDO для отображения ошибок в виде исключений.

PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION

таким образом, ошибки из запросов базы данных не будут раскрывать конфиденциальные данные, такие как структура каталогов, имя пользователя базы данных и т. д.

и последнее, но не менее важное: есть моменты, когда вы не должны доверять PDO 100% и будете обязаны принять некоторые дополнительные меры для предотвращения SQL-инъекции, один из этих случаев, если вы используете устаревшие версии mysql [ mysql =< 5.3.6 ] as описано в этом ответе

но, используя подготовленные операторы, как показано выше, всегда будет безопаснее, чем использование любой из функций, которые начинаются с mysql_

хорошо читает

PDO учебник для разработчиков MySQL


нет*! Объект PDO заключается в том, что вам не нужно ничего избегать; вы просто отправляете его как данные. Например:

$query = $link->prepare('SELECT * FROM users WHERE username = :name LIMIT 1;');
$query->execute([':name' => $username]); # No need to escape it!

против:

$safe_username = mysql_real_escape_string($username);
mysql_query("SELECT * FROM users WHERE username = '$safe_username' LIMIT 1;");

* Ну, есть один, как сказал Михаил Берковский! Но есть и лучшие способы.


$v = '"'.mysql_real_escape_string($v).'"'; 

эквивалентно $v = $this->db->quote($v); убедитесь, что у вас есть экземпляр PDO в $this->db таким образом, вы можете вызвать метод pdo quote()


Не нужно использования mysql_real_escape_string в PDO.

PDO сам настраивает специальный символ в запросе mysql, вам нужно только передать анонимный параметр и связать его время выполнения.вроде этого Предположим, у вас есть таблица пользователя с именем атрибута, электронной почтой и паролем, и вы должны вставить в эту инструкцию use prepare вы можете передать имя как = > $name= "Rajes'H";

он должен выполняться, нет необходимости в эквиваленте использования mysql_real_escape_string

$stmt="INSERT into user(name,email,password) VALUES(:name,:email,password)";
try{
   $pstmt=$dbh->prepare($stmt);//$dbh database handler for executing mysql query
   $pstmt->bindParam(':name',$name,PDO::PARAM_STR);
   $pstmt->bindParam(':email',$email,PDO::PARAM_STR);
   $pstmt->bindParam(':password',$password,PDO::PARAM_STR);
   $status=$pstmt->execute();
   if($status){
    //next line of code 
   }


}catch(PDOException $pdo){
     echo $pdo->getMessage();
}

Если ответить на исходный вопрос, то это эквивалент PDO для mysql_real_escape_string:

function my_real_escape_string($value, $connection) {
    /* 
    // this fails on: value="hello'";
    return trim ($connection->quote($value), "'");
    */
    return substr($connection->quote($value), 1, -1);       
}

кстати, эквивалент mysqli:

function my_real_escape_string($value, $connection) {
    return mysqli_real_escape_string($connection, $value);
}