PHP 8.4.2 Released!

SQLite3::setAuthorizer

(PHP 8)

SQLite3::setAuthorizerConfigure une fonction de rappel à utiliser comme autorisateur pour limiter ce qu'une instruction peut faire

Description

public SQLite3::setAuthorizer(?callable $callback): bool

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 :

Liste des codes d'action et des paramètres
Action Second paramètre Troisième paramètre
SQLite3::CREATE_INDEXNom de l'indexNom de la table
SQLite3::CREATE_TABLENom de la tablenull
SQLite3::CREATE_TEMP_INDEXNom de l'indexNom de la table
SQLite3::CREATE_TEMP_TABLENom de la tablenull
SQLite3::CREATE_TEMP_TRIGGERNom du déclencheurNom de la table
SQLite3::CREATE_TEMP_VIEWNom de la vuenull
SQLite3::CREATE_TRIGGERNom du déclencheurNom de la table
SQLite3::CREATE_VIEWNom de la vuenull
SQLite3::DELETENom de la tablenull
SQLite3::DROP_INDEXNom de l'indexNom de la table
SQLite3::DROP_TABLENom de la tablenull
SQLite3::DROP_TEMP_INDEXNom de l'indexNom de la table
SQLite3::DROP_TEMP_TABLENom de la tablenull
SQLite3::DROP_TEMP_TRIGGERNom du déclencheurNom de la table
SQLite3::DROP_TEMP_VIEWNom de la vuenull
SQLite3::DROP_TRIGGERNom du déclencheurNom de la table
SQLite3::DROP_VIEWNom de la vuenull
SQLite3::INSERTNom de la tablenull
SQLite3::PRAGMANom PragmaLe premier argument passé au pragma, ou null
SQLite3::READNom de la tableNom de la colonne
SQLite3::SELECTnullnull
SQLite3::TRANSACTIONOpérationnull
SQLite3::UPDATENom de la tableNom de la colonne
SQLite3::ATTACHFilenamenull
SQLite3::DETACHNom de la base de donnéesnull
SQLite3::ALTER_TABLENom DatabaseNom de la table
SQLite3::REINDEXNom de l'indexnull
SQLite3::ANALYZENom de la tablenull
SQLite3::CREATE_VTABLENom de la tableNom du module
SQLite3::DROP_VTABLENom de la tableNom du module
SQLite3::FUNCTIONnullNom de la fonction
SQLite3::SAVEPOINTOpérationNom du point de sauvegarde
SQLite3::RECURSIVEnullnull

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.

Liste de paramètres

callback

Le callable à appeler.

Si null est passé, cela désactivera le rappel de l'autorisateur actuel.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Erreurs / Exceptions

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()).

Exemples

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] =>
)
add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top