(PHP 8)
SQLite3::setAuthorizer — Configure une fonction de rappel à utiliser comme autorisateur pour limiter ce qu'une instruction peut faire
Définit une fonction de rappel qui sera appelée par SQLite chaque fois qu'une action est effectuée (lecture, suppression, mise à jour, etc.). Cela est utilisé lors de la préparation d'une instruction SQL à partir d'une source non fiable pour s'assurer que les instructions SQL ne tentent pas d'accéder à des données auxquelles elles ne sont pas autorisées à accéder, ou qu'elles ne tentent pas d'exécuter des instructions malveillantes qui endommagent la base de données. Par exemple, une application peut autoriser un utilisateur à saisir des requêtes SQL arbitraires pour évaluation par une base de données. Mais l'application ne veut pas que l'utilisateur puisse apporter des modifications arbitraires à la base de données. Un autorisateur pourrait alors être mis en place pendant que le SQL saisi par l'utilisateur est préparé pour interdire tout sauf les déclarations SELECT.
La fonction de rappel de l'autorisateur peut être appelée plusieurs fois pour chaque instruction préparée par
SQLite. Une requête SELECT
ou UPDATE
appellera l'autorisateur pour chaque
colonne qui serait lue ou mise à jour.
La fonction de rappel de l'autorisateur est appelée avec jusqu'à cinq paramètres. Le premier paramètre est toujours
donnée, et est un int (code d'action) correspondant à une constante de
SQLite3
. Les autres paramètres ne sont passés que pour certaines actions. Le
tableau suivant décrit les deuxième et troisième paramètres en fonction de l'action :
Action | Second paramètre | Troisième paramètre |
---|---|---|
SQLite3::CREATE_INDEX | Nom de l'index | Nom de la table |
SQLite3::CREATE_TABLE | Nom de la table | null |
SQLite3::CREATE_TEMP_INDEX | Nom de l'index | Nom de la table |
SQLite3::CREATE_TEMP_TABLE | Nom de la table | null |
SQLite3::CREATE_TEMP_TRIGGER | Nom du déclencheur | Nom de la table |
SQLite3::CREATE_TEMP_VIEW | Nom de la vue | null |
SQLite3::CREATE_TRIGGER | Nom du déclencheur | Nom de la table |
SQLite3::CREATE_VIEW | Nom de la vue | null |
SQLite3::DELETE | Nom de la table | null |
SQLite3::DROP_INDEX | Nom de l'index | Nom de la table |
SQLite3::DROP_TABLE | Nom de la table | null |
SQLite3::DROP_TEMP_INDEX | Nom de l'index | Nom de la table |
SQLite3::DROP_TEMP_TABLE | Nom de la table | null |
SQLite3::DROP_TEMP_TRIGGER | Nom du déclencheur | Nom de la table |
SQLite3::DROP_TEMP_VIEW | Nom de la vue | null |
SQLite3::DROP_TRIGGER | Nom du déclencheur | Nom de la table |
SQLite3::DROP_VIEW | Nom de la vue | null |
SQLite3::INSERT | Nom de la table | null |
SQLite3::PRAGMA | Nom Pragma | Le premier argument passé au pragma, ou null |
SQLite3::READ | Nom de la table | Nom de la colonne |
SQLite3::SELECT | null | null |
SQLite3::TRANSACTION | Opération | null |
SQLite3::UPDATE | Nom de la table | Nom de la colonne |
SQLite3::ATTACH | Filename | null |
SQLite3::DETACH | Nom de la base de données | null |
SQLite3::ALTER_TABLE | Nom Database | Nom de la table |
SQLite3::REINDEX | Nom de l'index | null |
SQLite3::ANALYZE | Nom de la table | null |
SQLite3::CREATE_VTABLE | Nom de la table | Nom du module |
SQLite3::DROP_VTABLE | Nom de la table | Nom du module |
SQLite3::FUNCTION | null | Nom de la fonction |
SQLite3::SAVEPOINT | Opération | Nom du point de sauvegarde |
SQLite3::RECURSIVE | null | null |
Le quatrième paramètre sera le nom de la base de données ("main"
,
"temp"
, etc.) si applicable.
Le cinquième paramètre de la fonction de rappel de l'autorisateur est le nom du déclencheur ou de la vue le plus
interne qui est responsable de la tentative d'accès ou null
si cette tentative d'accès est directement issue du
code SQL de niveau supérieur.
Lorsque que la fonction de rappel retourne SQLite3::OK
, cela signifie que l'opération
demandée est acceptée. Lorsque la fonction de rappel retourne SQLite3::DENY
, l'appel qui a
déclenché l'autorisateur échouera avec un message d'erreur expliquant que
l'accès est refusé.
Si le code d'action est SQLite3::READ
et que la fonction de rappel retourne
SQLite3::IGNORE
, alors l'instruction préparée est construite pour substituer une valeur
null
à la place de la colonne de la table qui aurait été lue si SQLite3::OK
avait été retourné.
Le retour de SQLite3::IGNORE
peut être utilisé pour refuser à un utilisateur non fiable l'accès
à des colonnes individuelles d'une table.
Lorsqu'une table est référencée par un SELECT
mais aucune valeur de colonne n'est extraite de
cette table (par exemple dans une requête comme "SELECT count(*) FROM table"
), alors la fonction
de rappel de l'autorisateur est invoquée une fois pour cette table avec un nom de colonne qui est une chaîne vide.
Si le code d'action est SQLite3::DELETE
et que la fonction de rappel retourne
SQLite3::IGNORE
, alors l'opération DELETE se poursuit mais l'optimisation de troncature est
désactivée et toutes les lignes sont supprimées individuellement.
Seul un seule autorisateur peut être en place sur une connexion de base de données à la fois. Chaque appel à
SQLite3::setAuthorizer() remplace l'appel précédent. Désactivez l'autorisateur en installant
un rappel null
. L'autorisateur est désactivé par défaut.
La fonction de rappel de l'autorisateur ne doit pas faire quoi que ce soit qui modifiera la connexion de base de données qui a invoqué la fonction de rappel de l'autorisateur.
Il est à noter que l'autorisateur n'est appelé que lorsqu une instruction est préparée, pas lorsqu'elle est exécutée.
Plus de détails peuvent être trouvés dans la » documentation de SQLite3.
Cette méthode ne lance aucune erreur, mais si un autorisateur est activé et retourne une valeur invalide, la préparation de l'instruction lancera une erreur (ou une exception, selon l'utilisation de la méthode SQLite3::enableExceptions()).
Exemple #1 Exemple de SQLite3::setAuthorizer()
Ceci n'autorise que l'accès en lecture, et seuls certains colonnes de la table
users
seront retournées. Les autres colonnes seront remplacées par
null
.
<?php
$db = new SQLite3('data.sqlite');
$db->exec('CREATE TABLE users (id, name, password);');
$db->exec('INSERT INTO users VALUES (1, \'Pauline\', \'Snails4eva\');');
$allowed_columns = ['id', 'name'];
$db->setAuthorizer(function (int $action, ...$args) use ($allowed_columns) {
if ($action === SQLite3::READ) {
list($table, $column) = $args;
if ($table === 'users' && in_array($column, $allowed_columns) {
return SQLite3::OK;
}
return SQLite3::IGNORE;
}
return SQLite3::DENY;
});
print_r($db->querySingle('SELECT * FROM users WHERE id = 1;'));
L'exemple ci-dessus va afficher :
Array ( [id] => 1 [name] => Pauline [password] => )