(PHP 8 >= 8.5.0)
Pdo\Sqlite::setAuthorizer — Configura una retrollamada para usarla como autorizador y limitar lo que puede hacer una sentencia
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.
callback
El callable a invocar, o null para deshabilitar la
retrollamada de autorización actual.
Debe devolver uno de Pdo\Sqlite::OK,
Pdo\Sqlite::DENY o
Pdo\Sqlite::IGNORE.
Cuando se devuelve Pdo\Sqlite::DENY, la sentencia que
activó el autorizador falla con un error que indica que el acceso ha sido denegado.
Cuando se devuelve Pdo\Sqlite::IGNORE para una acción de lectura,
la sentencia se prepara de modo que se sustituye un valor null por la
columna que habría sido leída.
No se retorna ningún valor.
Este método en sí mismo no lanza excepciones, pero si la retrollamada del autorizador
no devuelve un valor de tipo int, o devuelve un int que no es uno de
Pdo\Sqlite::OK, Pdo\Sqlite::DENY o
Pdo\Sqlite::IGNORE, la preparación de la sentencia lanza un
TypeError o un ValueError
respectivamente.
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