Подтвердить что ты не робот

Что такое PDO-эквивалент функции mysql_real_escape_string?

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

4b9b3361

Ответ 1

Нет, нет!

Технически, существует 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=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();
 }

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

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

Ответ 2

Нет ни одного! Объектом 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;");

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

Ответ 3

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

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

Ответ 4

Нет необходимости в mysql_real_escape_string в PDO.

PDO сам настраивает специальный символ в запросе MySQL, вам нужно только передать анонимный параметр и связать его во время выполнения. Предположим, у вас есть пользовательская таблица с именем атрибута, адресом электронной почты и паролем, и вы должны вставить в это выражение о подготовке, например Вы можете передать имя как => $ 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();
}

Ответ 5

Если для ответа на исходный вопрос, то это эквивалент 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);       
}

btw эквивалент mysqli:

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

Ответ 6

В ответ на комментарии многих людей здесь, но я пока не могу комментировать напрямую (не набрал 50 баллов), там НАСТОЯТЕЛЬНО необходимо использовать ДАЖЕ $dbh->quote($value) при использовании PDO, и это вполне оправданные причины...

  1. Если вы просматриваете много записей, создавая команду "BULK INSERT" (я обычно перезагружаюсь на 1000 записей) из-за использования таблиц InnoDb в MySQL/Maria Db. Создание отдельных команд вставки с использованием подготовленных операторов очень удобно, но крайне неэффективно при выполнении массовых задач!
  2. PDO еще не может работать с динамическими структурами IN (...), поэтому, когда вы создаете список строк IN из списка пользовательских переменных, ВАМ НУЖНО $dbh->quote($value) каждое значение в списке!

Так что да, при использовании PDO необходимо использовать $dbh->quote($value) и, вероятно, ПОЧЕМУ команда доступна в первую очередь.

PS, вам по-прежнему не нужно заключать в кавычки команду, команда $dbh->quote($value) также сделает это за вас.

Вне.