Что делает pg_escape_string?

Я использую следующий скрипт, который берет данные из html-формы и хранит в DB Postgres. Существует функция pg_escape_string, которая сохраняет значение из формы в переменную php. Поиск в Интернете во всем, я обнаружил, что pg_escape_string escapes строку для вставки в базу данных. Я не очень понимаю это. Что это действительно ускользает? Что на самом деле происходит, когда говорится, что строка сбежала?

<html> <head></head> <body> <?php if ($_POST['submit']) { // attempt a connection $dbh = pg_connect("host=localhost dbname=test user=postgres"); if (!$dbh) { die("Error in connection: " . pg_last_error()); } // escape strings in input data $code = pg_escape_string($_POST['ccode']); $name = pg_escape_string($_POST['cname']); // execute query $sql = "INSERT INTO Countries (CountryID, CountryName) VALUES('$code', '$name')"; $result = pg_query($dbh, $sql); if (!$result) { die("Error in SQL query: " . pg_last_error()); } echo "Data successfully inserted!"; // free memory pg_free_result($result); // close connection pg_close($dbh); } ?> <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"> Country code: <br> <input type="text" name="ccode" size="2"> <p> Country name: <br> <input type="text" name="cname"> <p> <input type="submit" name="submit"> </form> </body> </html> 

Рассмотрим следующий код:

 $sql = "INSERT INTO airports (name) VALUES ('$name')"; 

Теперь предположим, что $name является "Chicago O'Hare" . Когда вы выполняете интерполяцию строк, вы получаете этот код SQL:

 INSERT INTO airports (name) VALUES ('Chicago O'Hare') 

который плохо сформирован, потому что апостроф интерпретируется как метка цитаты SQL , и ваш запрос будет ошибочным.

Хуже того, это может случиться. Фактически, SQL-инъекция была ранжирована № 1 Самая опасная ошибка программного обеспечения 2011 года MITER.

Но вы никогда не должны создавать SQL-запросы с использованием строковой интерполяции. Вместо этого используйте запросы с параметрами .

 $sql = 'INSERT INTO airports (name) VALUES ($1)'; $result = pg_query_params($db, $sql, array("Chicago O'Hare")); 

pg_escape_string () предотвращает внедрение SQL-кода в ваш код