(PHP 8 >= 8.5.0)
Pdo\Sqlite::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 provenant d'une source non fiable, afin de s'assurer que l'instruction n'accède pas à des données qu'elle n'est pas autorisée à voir et n'exécute pas d'instructions malveillantes qui endommageraient la base de données.
L'autorisateur n'est utilisé que pendant la phase de préparation de l'instruction.
Il peut être appelé plusieurs fois pour une seule instruction : une requête
SELECT ou UPDATE l'appelle pour chaque colonne
qui serait lue ou mise à jour. Il est appelé de nouveau chaque fois que SQLite
prépare à nouveau une instruction, ce qui peut se produire pendant que l'instruction
est en cours d'exécution, par exemple après une modification du schéma.
L'autorisateur est appelé avec jusqu'à cinq arguments. Les arguments reçus sont décrits sur la page SQLite3::setAuthorizer().
Un seul autorisateur peut être en place à la fois sur une connexion à une base de
données. Chaque appel à cette méthode remplace le précédent. L'autorisateur est
désactivé par défaut, et peut être désactivé de nouveau en définissant une fonction
de rappel null.
La fonction de rappel ne doit pas modifier la connexion à la base de données qui l'a invoquée.
Plus de détails sont disponibles dans la » documentation de SQLite.
Note:
Cette méthode est l'équivalent de SQLite3::setAuthorizer(), à ceci près qu'elle retourne void au lieu de bool.
callback
Le callable à invoquer, ou null pour désactiver la fonction de
rappel d'autorisation courante.
Il doit retourner l'une des valeurs Pdo\Sqlite::OK,
Pdo\Sqlite::DENY ou
Pdo\Sqlite::IGNORE.
Lorsque Pdo\Sqlite::DENY est retourné, l'instruction qui a
déclenché l'autorisateur échoue avec une erreur indiquant que l'accès est refusé.
Lorsque Pdo\Sqlite::IGNORE est retourné pour une action de
lecture, l'instruction est préparée de sorte qu'une valeur null soit substituée
à la colonne qui aurait été lue.
Aucune valeur n'est retournée.
Cette méthode elle-même ne lance pas d'exception, mais si la fonction de rappel
d'autorisation ne retourne pas un int, ou retourne un int
qui n'est pas l'une des valeurs Pdo\Sqlite::OK,
Pdo\Sqlite::DENY ou Pdo\Sqlite::IGNORE,
la préparation de l'instruction lance respectivement une
TypeError ou une
ValueError.
Exemple #1 Exemple avec Pdo\Sqlite::setAuthorizer()
Seules les actions de lecture sont autorisées sur la connexion. Les codes d'action sont exposés en tant que constantes de la classe SQLite3, ce qui nécessite que l'extension SQLite3 soit disponible ; leurs valeurs entières peuvent être utilisées directement dans le cas contraire.
<?php
$db = new Pdo\Sqlite('sqlite::memory:');
$db->exec('CREATE TABLE users (id, name)');
$db->setAuthorizer(function (int $action, ...$args) {
return match ($action) {
SQLite3::SELECT, SQLite3::READ => Pdo\Sqlite::OK,
default => Pdo\Sqlite::DENY,
};
});
var_dump($db->query('SELECT name FROM users') instanceof PDOStatement);
try {
$db->exec('DROP TABLE users');
} catch (PDOException $e) {
echo $e->getMessage(), "\n";
}
?>Résultat de l'exemple ci-dessus est similaire à :
bool(true) SQLSTATE[HY000]: General error: 23 not authorized