SQLite3::setAuthorizer

(PHP 8)

SQLite3::setAuthorizerConfigura una función de retrollamada para utilizar como autorizador para limitar lo que una sentencia puede hacer

Descripción

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

Define una función de retrollamada que será llamada por SQLite cada vez que se realiza una acción (lectura, eliminación, actualización, etc.). Esto se utiliza durante la preparación de una sentencia SQL a partir de una fuente no confiable para asegurarse de que las sentencias SQL no intenten acceder a datos a los que no están autorizadas a acceder, o que no intenten ejecutar sentencias maliciosas que dañen la base de datos. Por ejemplo, una aplicación puede autorizar a un usuario a introducir consultas SQL arbitrarias para evaluación por una base de datos. Pero la aplicación no quiere que el usuario pueda realizar modificaciones arbitrarias en la base de datos. Un autorizador podría entonces establecerse mientras el SQL introducido por el usuario es preparado para prohibir todo excepto las declaraciones SELECT.

La función de retrollamada del autorizador puede ser llamada varias veces para cada sentencia preparada por SQLite. Una consulta SELECT o UPDATE llamará al autorizador para cada columna que sería leída o actualizada.

La función de retrollamada del autorizador es llamada con hasta cinco parámetros. El primer parámetro siempre es proporcionado, y es un int (código de acción) correspondiente a una constante de SQLite3. Los otros parámetros solo se pasan para ciertas acciones. La tabla siguiente describe los parámetros segundo y tercero según la acción:

Lista de códigos de acción y parámetros
Acción Segundo parámetro Tercer parámetro
SQLite3::CREATE_INDEXNombre del índiceNombre de la tabla
SQLite3::CREATE_TABLENombre de la tablanull
SQLite3::CREATE_TEMP_INDEXNombre del índiceNombre de la tabla
SQLite3::CREATE_TEMP_TABLENombre de la tablanull
SQLite3::CREATE_TEMP_TRIGGERNombre del disparadorNombre de la tabla
SQLite3::CREATE_TEMP_VIEWNombre de la vistanull
SQLite3::CREATE_TRIGGERNombre del disparadorNombre de la tabla
SQLite3::CREATE_VIEWNombre de la vistanull
SQLite3::DELETENombre de la tablanull
SQLite3::DROP_INDEXNombre del índiceNombre de la tabla
SQLite3::DROP_TABLENombre de la tablanull
SQLite3::DROP_TEMP_INDEXNombre del índiceNombre de la tabla
SQLite3::DROP_TEMP_TABLENombre de la tablanull
SQLite3::DROP_TEMP_TRIGGERNombre del disparadorNombre de la tabla
SQLite3::DROP_TEMP_VIEWNombre de la vistanull
SQLite3::DROP_TRIGGERNombre del disparadorNombre de la tabla
SQLite3::DROP_VIEWNombre de la vistanull
SQLite3::INSERTNombre de la tablanull
SQLite3::PRAGMANombre PragmaEl primer argumento pasado al pragma, o null
SQLite3::READNombre de la tablaNombre de la columna
SQLite3::SELECTnullnull
SQLite3::TRANSACTIONOperaciónnull
SQLite3::UPDATENombre de la tablaNombre de la columna
SQLite3::ATTACHFilenamenull
SQLite3::DETACHNombre de la base de datosnull
SQLite3::ALTER_TABLENombre DatabaseNombre de la tabla
SQLite3::REINDEXNombre del índicenull
SQLite3::ANALYZENombre de la tablanull
SQLite3::CREATE_VTABLENombre de la tablaNombre del módulo
SQLite3::DROP_VTABLENombre de la tablaNombre del módulo
SQLite3::FUNCTIONnullNombre de la función
SQLite3::SAVEPOINTOperaciónNombre del punto de guardado
SQLite3::RECURSIVEnullnull

El cuarto parámetro será el nombre de la base de datos ("main", "temp", etc.) si es aplicable.

El quinto parámetro de la función de retrollamada del autorizador es el nombre del disparador o de la vista más interno que es responsable del intento de acceso o null si este intento de acceso proviene directamente del código SQL de nivel superior.

Cuando la función de retrollamada devuelve SQLite3::OK, significa que la operación solicitada es aceptada. Cuando la función de retrollamada devuelve SQLite3::DENY, la llamada que provocó el autorizador fallará con un mensaje de error explicando que el acceso es denegado.

Si el código de acción es SQLite3::READ y la función de retrollamada devuelve SQLite3::IGNORE, entonces la sentencia preparada se construye para sustituir un valor null en lugar de la columna de la tabla que se habría leído si SQLite3::OK se hubiera devuelto. Devolver SQLite3::IGNORE puede ser utilizado para denegar a un usuario no confiable el acceso a columnas individuales de una tabla.

Cuando una tabla es referenciada por un SELECT pero no se extrae ningún valor de columna de esa tabla (por ejemplo en una consulta como "SELECT count(*) FROM table"), entonces la función de retrollamada del autorizador se invoca una vez para esa tabla con un nombre de columna que es una cadena vacía.

Si el código de acción es SQLite3::DELETE y la función de retrollamada devuelve SQLite3::IGNORE, entonces la operación DELETE continúa pero la optimización de truncamiento es desactivada y todas las filas se eliminan individualmente.

Solo un autorizador puede estar activo en una conexión de base de datos a la vez. Cada llamada a SQLite3::setAuthorizer() reemplaza la llamada anterior. Desactive el autorizador instalando una retrollamada null. El autorizador está desactivado por omisión.

La función de retrollamada del autorizador no debe hacer nada que modifique la conexión de base de datos que ha invocado la función de retrollamada del autorizador.

Es importante señalar que el autorizador solo se llama cuando una sentencia es preparada, no cuando es ejecutada.

Más detalles pueden encontrarse en la » documentación de SQLite3.

Parámetros

callback

El callable a llamar.

Si se pasa null, esto desactivará la retrollamada del autorizador actual.

Valores devueltos

Devuelve true en caso de éxito o false en caso de error.

Errores/Excepciones

Este método no lanza ningún error, pero si un autorizador está activado y devuelve un valor inválido, la preparación de la sentencia lanzará un error (o una excepción, según el uso del método SQLite3::enableExceptions()).

Ejemplos

Ejemplo #1 Ejemplo de SQLite3::setAuthorizer()

Esto solo autoriza el acceso de lectura, y solo ciertas columnas de la tabla users serán devueltas. Las otras columnas serán reemplazadas por 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;'));

El resultado del ejemplo sería:

Array
(
    [id] => 1
    [name] => Pauline
    [password] =>
)
add a note

User Contributed Notes

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