Pdo\Sqlite::setAuthorizer
(PHP 8 >= 8.5.0)
Pdo\Sqlite::setAuthorizer — Configura una retrollamada para usarla como autorizador y limitar lo que puede hacer una sentencia
Descripción
public function Pdo\Sqlite::setAuthorizer(
?callable $callback):
void
Establece una retrollamada que será invocada por SQLite cada vez que se realice
una acción (lectura, eliminación, actualización, etc.). Se utiliza cuando se prepara
una sentencia SQL de una fuente no confiable para garantizar que la sentencia no acceda
a datos que no tiene permitido ver ni ejecute sentencias maliciosas que dañen la base de datos.
El autorizador solo se utiliza durante la fase de preparación de la sentencia.
Puede ser llamado varias veces para una sola sentencia: una consulta
SELECT o UPDATE lo invoca por cada
columna que sería leída o actualizada. Se ejecuta de nuevo cada vez que SQLite
vuelve a preparar una sentencia, lo que puede ocurrir mientras la sentencia está siendo
ejecutada, por ejemplo, después de que el esquema haya cambiado.
El autorizador es llamado con hasta cinco argumentos. Los argumentos recibidos se
describen en SQLite3::setAuthorizer().
Solo puede haber un autorizador activo en una conexión de base de datos a la vez.
Cada llamada a este método reemplaza la anterior. El autorizador está deshabilitado
de forma predeterminada, y puede deshabilitarse de nuevo estableciendo una retrollamada null.
La retrollamada no debe modificar la conexión de base de datos que la invocó.
Más detalles pueden encontrarse en la
» documentación de SQLite.
Nota:
Este método es el equivalente de SQLite3::setAuthorizer(),
salvo que devuelve void en lugar de bool.
Valores devueltos
No se retorna ningún valor.
Ejemplos
Ejemplo #1 Ejemplo de Pdo\Sqlite::setAuthorizer()
Solo se permiten acciones de lectura en la conexión. Los códigos de acción están expuestos
como constantes de clase SQLite3, lo que requiere que la
extensión SQLite3 esté disponible; sus
valores enteros pueden usarse directamente en caso contrario.
<?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";
}
?>
Resultado del ejemplo anterior
es similar a:
bool(true)
SQLSTATE[HY000]: General error: 23 not authorized
Véase también
- SQLite3::setAuthorizer() - Configura una función de retrollamada para utilizar como autorizador para limitar lo que una sentencia puede hacer