Что такое PDO-эквивалент реальной escape-строки функции mysql?
Я изменяю свой код с использования mysql_*
на PDO
. В моем коде у меня было mysql_real_escape_string()
. Что эквивалентно этому в PDO?
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
Нет никакого*! Цель 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);
}