неділя, 23 грудня 2007 р.

PHP і Firebird: історичний приклад ibase_* та безпека SQL-запитів

Коли я готував цю нотатку у 2007 році, знайти приклади роботи PHP з InterBase та Firebird було складніше, ніж із MySQL. За моїми тодішніми спостереженнями, пошук частіше повертав матеріали про Delphi з InterBase. Тому я зібрав власний приклад підключення, читання результатів і вставлення даних.

Початковий код

Це архівний приклад API ibase_*. Він містить побудову SQL через конкатенацію зовнішніх даних, тому його не слід копіювати у робочий застосунок без перероблення.

// Подключение к базе данных Interbase
$conn=ibase_connect($dbname,$dbuser,$dbpass);


// Выполнение SQL-запроса и получение информации из него (аналогично, как в MySQL):
$stmt = 'select * from GET_ZAKAZID';
$sth = ibase_query($conn, $stmt);
  while ($row = ibase_fetch_object($sth)) {
    $zakazn=$row->DOCN_RETURN;
  }
ibase_free_result($sth); // Освобождаем ресурсы, после получения необходимых данных



// Выполнение простой вставки с помощью INSERT
$stmt = 'INSERT INTO ZAKAZ(ZAKAZID, ZAKAZNA, TYPEZAKAZID'
  .',EMAIL, KONT_TELEPHONE, MTELEPHONE, ICQ'
  .') VALUES ('
  .$zakazn.",'".trim(strip_tags(@$_POST['date_vipoln']))."',".@$_POST['type_cli'] .",'".trim(strip_tags(@$_POST['email']))."','".trim(strip_tags(@$_POST['telephone']))               ."','".trim(strip_tags(@$_POST['mtelephone']))."',".trim(strip_tags(@$_POST['icq']))
             .")";
$sth = ibase_query($conn, $stmt) or die(ibase_errmsg());


// Закрываем коннект, после работы с базой данных
ibase_close($conn);

Що робить приклад

ibase_connect відкриває з’єднання; ibase_query виконує запит; ibase_fetch_object читає рядки результату; ibase_free_result звільняє результат, а ibase_close закриває з’єднання. Назви таблиць, полів і процедури в коді належать до конкретної авторської бази.

Що важливо змінити в новій реалізації

Виклики trim і strip_tags не перетворюють введення користувача на безпечний SQL. Значення потрібно передавати параметрами підготовленого запиту, а не склеювати з текстом команди. Параметри призначені для значень; назви таблиць чи довільні фрагменти SQL так передавати не можна.

За документацією PHP 7.4, розширення Firebird/InterBase винесено з основного постачання. Для сучасного підключення до Firebird перевірте можливості PDO_FIREBIRD. Сумісність та керування транзакціями потрібно врахувати для вашого застосунку окремо.

Пов’язана історична нотатка: установлення розширення у PHP 5 на Ubuntu.

Немає коментарів:

K2 відкрила курс з ERP: 61 урок, практика й сертифікат

Перший день у новій ERP часто починається з пошуку потрібної кнопки. Наступний виклик складніший: зрозуміти, що зміниться після натискання. ...