Что такое PDO-эквивалент реальной escape-строки функции mysql?


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

Author: Peter Mortensen, 2012-12-23

5 answers

Ну нет, такого нет!

Технически существует 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 ], как описано в этом ответе

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

Хорошо читается

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

 59
Author: samayo, 2018-07-12 16:11:44

Нет никакого*! Цель 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;");

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

 25
Author: Ry-, 2014-02-01 15:50:57
$v = '"'.mysql_real_escape_string($v).'"'; 

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

 3
Author: simohamed, 2015-04-04 13:58:24

Нет необходимости в 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();
}
 0
Author: IMRA, 2018-07-25 13:08:03

Если ответить на первоначальный вопрос, то это эквивалент 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);
}
 -1
Author: IT goldman, 2015-12-30 08:02:25