SQLite3::setAuthorizer
(PHP 8)
SQLite3::setAuthorizer — Встановлює callback-функцію, яка буде використовуватися як авторизатор для обмеження дій висловлювання
Опис
public SQLite3::setAuthorizer(?callable $callback): bool
Встановлює callback-функцію, яка буде викликатися SQLite щоразу під час виконання дії (читання, видалення, модифікація тощо.). Це використовується при підготовці SQL-виразів з ненадійного джерела, щоб гарантувати, що SQL-вирази не намагатимуться отримати доступ до даних, які їм не дозволено бачити, або щоб вони не намагалися виконати шкідливі вирази, що ушкоджують базу даних. Наприклад, програма може дозволити користувачеві вводити довільні SQL-запити для виконання у базі даних. Але програма не хоче, щоб користувач міг вносити довільні зміни до бази даних. Тоді можна встановити авторизатор, який забороняє використання будь-яких виразів, крім SELECT, поки готується введений користувачем SQL запит.
Callback-авторизатор може бути викликаний кілька разів кожного висловлювання, підготовленого SQLite. Запити SELECT
илиUPDATE
будуть викликати авторизатор для кожної колонки, що зчитується або модифікується.
Виклик авторизатора може використовуватися до п'яти параметрів. Перший параметр передається завжди, його тип - ціле число (int) (код дії), що збігається з константою SQLite3
. Інші параметри надсилаються лише для деяких дій. Ця таблиця описує другий і третій параметри відповідно до дії:
Список кодів дії та параметрів
Действие | Второй параметр | Третий параметр |
---|---|---|
SQLite3::CREATE_INDEX | Ім'я індексу | Ім'я таблиці |
SQLite3::CREATE_TABLE | Ім'я таблиці | null |
SQLite3::CREATE_TEMP_INDEX | Ім'я індексу | Ім'я таблиці |
SQLite3::CREATE_TEMP_TABLE | Ім'я таблиці | null |
SQLite3::CREATE_TEMP_TRIGGER | Ім'я тригера | Ім'я таблиці |
SQLite3::CREATE_TEMP_VIEW | Ім'я уявлення | null |
SQLite3::CREATE_TRIGGER | Ім'я тригера | Ім'я таблиці |
SQLite3::CREATE_VIEW | Ім'я уявлення | null |
SQLite3::DELETE | Ім'я таблиці | null |
SQLite3::DROP_INDEX | Ім'я індексу | Ім'я таблиці |
SQLite3::DROP_TABLE | Ім'я таблиці | null |
SQLite3::DROP_TEMP_INDEX | Ім'я індексу | Ім'я таблиці |
SQLite3::DROP_TEMP_TABLE | Ім'я таблиці | null |
SQLite3::DROP_TEMP_TRIGGER | Ім'я тригера | Ім'я таблиці |
SQLite3::DROP_TEMP_VIEW | Ім'я уявлення | null |
SQLite3::DROP_TRIGGER | Ім'я тригера | Ім'я таблиці |
SQLite3::DROP_VIEW | Ім'я уявлення | null |
SQLite3::INSERT | Ім'я таблиці | null |
SQLite3::PRAGMA | Ім'я pragma | Перший аргумент, переданий pragma, або null |
SQLite3::READ | Ім'я таблиці | Ім'я колонки |
SQLite3::SELECT | null | null |
SQLite3::TRANSACTION | Операція | null |
SQLite3::UPDATE | Ім'я таблиці | Ім'я колонки |
SQLite3::ATTACH | ім'я файлу | null |
SQLite3::DETACH | Ім'я бази даних | null |
SQLite3::ALTER_TABLE | Ім'я бази даних | Ім'я таблиці |
SQLite3::REINDEX | Ім'я індексу | null |
SQLite3::ANALYZE | Ім'я таблиці | null |
SQLite3::CREATE_VTABLE | Ім'я таблиці | Ім'я модуля |
SQLite3::DROP_VTABLE | Ім'я таблиці | Ім'я модуля |
SQLite3::FUNCTION | null | Ім'я функції |
SQLite3::SAVEPOINT | Операція | Ім'я точки збереження |
SQLite3::RECURSIVE | null | null |
Четвертим параметром буде ім'я бази даних ("main"
"temp"
і т.д.), якщо потрібно.
П'ятий параметр callback-авторизатора - ім'я самого внутрішнього тригера або подання, відповідального за спробу отримання доступу, або null
, якщо ця спроба отримання доступу зроблена безпосередньо з коду SQL верхнього рівня.
Коли callback-функція повертає **SQLite3::OK
**Це означає, що запитана операція прийнята. Коли callback-функція повертає SQLite3::DENY
, виклик, що запустив авторизатор, зазнає невдачі з повідомленням про помилку, що пояснює, що доступ заборонено.
Якщо код дії - SQLite3::READ
, і callback-функція повертає SQLite3::IGNORE
, то підготовлений вираз складається для заміни на null
значення колонки таблиці, яке б зчитувалося, якби повернувся код SQLite3::OK
ВозвратSQLite3::IGNORE
може використовуватися, щоб заборонити недовіреному користувачеві доступ до окремих колонок таблиці.
Коли на таблицю посилаються через SELECT
, але з неї не витягується жодного значення колонок, (наприклад, у запиті "SELECT count(*) FROM table"
), то callback-авторизатор**SQLite3::READ
** викликається один раз для цієї таблиці з ім'ям колонки, яке дорівнює порожньому рядку.
Якщо код дії - SQLite3::DELETE
, і callback-функція повертає **SQLite3::IGNORE
**тоді операція DELETE продовжує свою роботу, але з вимкненою оптимізацією видалення, і всі рядки видаляються окремо.
У поєднанні з базою даних одночасно може використовуватися лише один авторизатор. Кожен виклик SQLite3::setAuthorizer() перезаписує попередній. Вимкнути авторизатор можна, передавши null
замість callback-функції. За замовчуванням авторизатор вимкнено.
Callback-авторизатор не повинен робити нічого, що змінює підключення до бази даних, яке викликало callback-авторизатор.
Зверніть увагу, що авторизатор викликається тільки тоді, коли вираз готується, а не тоді, коли воно виконується.
Більш детальну інформацію можна знайти у » Документації SQLite3
Список параметрів
callback
Функцияcallable для дзвінка.
Якщо передано null
, то поточний callback-авторизатор буде вимкнено.
Значення, що повертаються
Повертає true
у разі успішного виконання або **false
**в случае возникновения ошибки.
Помилки
Цей метод не викликає жодних помилок, але якщо авторизатор включений і повертає некоректне значення, то при підготовці виразу буде викликана помилка (або викинутий виняток, залежно від використання методу SQLite3::enableExceptions()
Приклади
Приклад #1 Приклад використання SQLite3::setAuthorizer()****
У цьому прикладі дозволено доступ тільки для читання, і лише деякі з колонок таблиці users
будуть повернуті. Інші колонки будуть замінені на null
Loading...
Результат виконання наведеного прикладу:
Array
(
[id] => 1
[name] => Pauline
[password] =>
)