Я mysql_*
свой код от использования mysql_*
до PDO
. В моем коде у меня был mysql_real_escape_string()
. Что эквивалентно этому в PDO?
Ну нет, нет!
Технически существует PDO::quote()
но редко используется, и это не совсем эквивалентно mysql_real_escape_string()
Это верно! Если вы уже используете PDO надлежащим образом, как описано в prepared statements
, этого будет достаточно, чтобы защитить вас от инъекции mysql.
Example:
Ниже приведен пример безопасного запроса базы данных с помощью только подготовленных операторов.
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-injection благодаря PDO и мощности подготовленных операторов.
Стоит отметить, что вы должны передать атрибут charset=utf8
в свой DSN
как показано выше, по соображениям безопасности и всегда включать PDO, чтобы показывать ошибки в виде исключений.
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
поэтому ошибки из ваших запросов к базе данных не будут раскрывать конфиденциальные данные, такие как структура вашего каталога, имя пользователя базы данных и т. д.
И последнее, но не менее важное: бывают моменты, когда вам не следует доверять PDO 100% и будут вынуждены предпринять дополнительные меры для предотвращения внедрения sql, один из таких случаев, если вы используете устаревшие версии mysql [ mysql =< 5.3.6 ]
как описано в этом ответе
Но использование подготовленных операторов, как показано выше, всегда будет более безопасным, чем использование любых функций, которые начинаются с 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()
Если ответить на исходный вопрос, то это эквивалент 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); }