it-roy-ru.com

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

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

37
REJOLA

Ну нет, нет!

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

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


# Example:

Ниже приведен пример запроса к базе данных safe с использованием подготовленных операторов (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

61
samayo

Здесь ничего нет*! Целью 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;");

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

26
Ry-
$v = '"'.mysql_real_escape_string($v).'"'; 

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

5
Simo

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

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