Что именно делает pg_escape_string? - PullRequest
7 голосов
/ 01 сентября 2011

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

<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>

Ответы [ 2 ]

6 голосов
/ 01 сентября 2011

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

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

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

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

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

Могут случиться и худшие вещи . Фактически, SQL-инъекция была оценена MITRE # 1 Самой опасной ошибкой программного обеспечения 2011 .

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

$sql = 'INSERT INTO airports (name) VALUES ($1)';
$result = pg_query_params($db, $sql, array("Chicago O'Hare"));
2 голосов
/ 01 сентября 2011

pg_escape_string () предотвратить sql инъекцию в вашем коде

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