Files
doc-fr/reference/sqlite3/sqlite3/setauthorizer.xml
2024-08-27 20:46:11 +01:00

240 lines
12 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 855bfee2f3db70d7dbb4c60c7c4a4efa567f1c60 Maintainer: Fan2Shrek Status: ready -->
<!-- Reviewed: yes -->
<refentry xml:id="sqlite3.setauthorizer" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<refnamediv>
<refname>SQLite3::setAuthorizer</refname>
<refpurpose>Configure une fonction de rappel à utiliser comme autorisateur pour limiter ce qu'une instruction peut faire</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis role="SQLite3">
<modifier>public</modifier> <type>bool</type><methodname>SQLite3::setAuthorizer</methodname>
<methodparam><type class="union"><type>callable</type><type>null</type></type><parameter>callback</parameter></methodparam>
</methodsynopsis>
<para>
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.
</para>
<para>
La fonction de rappel de l'autorisateur peut être appelée plusieurs fois pour chaque instruction préparée par
SQLite. Une requête <literal>SELECT</literal> ou <literal>UPDATE</literal> appellera l'autorisateur pour chaque
colonne qui serait lue ou mise à jour.
</para>
<para>
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 <type>int</type> (code d'action) correspondant à une constante de
<literal>SQLite3</literal>. 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 :
<table>
<title>Liste des codes d'action et des paramètres</title>
<tgroup cols="3">
<thead>
<row>
<entry>Action</entry>
<entry>Second paramètre</entry>
<entry>Troisième paramètre</entry>
</row>
</thead>
<tbody>
<row><entry><constant>SQLite3::CREATE_INDEX</constant></entry><entry>Nom de l'index</entry><entry>Nom de la table</entry></row>
<row><entry><constant>SQLite3::CREATE_TABLE</constant></entry><entry>Nom de la table</entry><entry>&null;</entry></row>
<row><entry><constant>SQLite3::CREATE_TEMP_INDEX</constant></entry><entry>Nom de l'index</entry><entry>Nom de la table</entry></row>
<row><entry><constant>SQLite3::CREATE_TEMP_TABLE</constant></entry><entry>Nom de la table</entry><entry>&null;</entry></row>
<row><entry><constant>SQLite3::CREATE_TEMP_TRIGGER</constant></entry><entry>Nom du déclencheur</entry><entry>Nom de la table</entry></row>
<row><entry><constant>SQLite3::CREATE_TEMP_VIEW</constant></entry><entry>Nom de la vue</entry><entry>&null;</entry></row>
<row><entry><constant>SQLite3::CREATE_TRIGGER</constant></entry><entry>Nom du déclencheur</entry><entry>Nom de la table</entry></row>
<row><entry><constant>SQLite3::CREATE_VIEW</constant></entry><entry>Nom de la vue</entry><entry>&null;</entry></row>
<row><entry><constant>SQLite3::DELETE</constant></entry><entry>Nom de la table</entry><entry>&null;</entry></row>
<row><entry><constant>SQLite3::DROP_INDEX</constant></entry><entry>Nom de l'index</entry><entry>Nom de la table</entry></row>
<row><entry><constant>SQLite3::DROP_TABLE</constant></entry><entry>Nom de la table</entry><entry>&null;</entry></row>
<row><entry><constant>SQLite3::DROP_TEMP_INDEX</constant></entry><entry>Nom de l'index</entry><entry>Nom de la table</entry></row>
<row><entry><constant>SQLite3::DROP_TEMP_TABLE</constant></entry><entry>Nom de la table</entry><entry>&null;</entry></row>
<row><entry><constant>SQLite3::DROP_TEMP_TRIGGER</constant></entry><entry>Nom du déclencheur</entry><entry>Nom de la table</entry></row>
<row><entry><constant>SQLite3::DROP_TEMP_VIEW</constant></entry><entry>Nom de la vue</entry><entry>&null;</entry></row>
<row><entry><constant>SQLite3::DROP_TRIGGER</constant></entry><entry>Nom du déclencheur</entry><entry>Nom de la table</entry></row>
<row><entry><constant>SQLite3::DROP_VIEW</constant></entry><entry>Nom de la vue</entry><entry>&null;</entry></row>
<row><entry><constant>SQLite3::INSERT</constant></entry><entry>Nom de la table</entry><entry>&null;</entry></row>
<row><entry><constant>SQLite3::PRAGMA</constant></entry><entry>Nom Pragma</entry><entry>Le premier argument passé au pragma, ou &null;</entry></row>
<row><entry><constant>SQLite3::READ</constant></entry><entry>Nom de la table</entry><entry>Nom de la colonne</entry></row>
<row><entry><constant>SQLite3::SELECT</constant></entry><entry>&null;</entry><entry>&null;</entry></row>
<row><entry><constant>SQLite3::TRANSACTION</constant></entry><entry>Opération</entry><entry>&null;</entry></row>
<row><entry><constant>SQLite3::UPDATE</constant></entry><entry>Nom de la table</entry><entry>Nom de la colonne</entry></row>
<row><entry><constant>SQLite3::ATTACH</constant></entry><entry>Filename</entry><entry>&null;</entry></row>
<row><entry><constant>SQLite3::DETACH</constant></entry><entry>Nom de la base de données</entry><entry>&null;</entry></row>
<row><entry><constant>SQLite3::ALTER_TABLE</constant></entry><entry>Nom Database</entry><entry>Nom de la table</entry></row>
<row><entry><constant>SQLite3::REINDEX</constant></entry><entry>Nom de l'index</entry><entry>&null;</entry></row>
<row><entry><constant>SQLite3::ANALYZE</constant></entry><entry>Nom de la table</entry><entry>&null;</entry></row>
<row><entry><constant>SQLite3::CREATE_VTABLE</constant></entry><entry>Nom de la table</entry><entry>Nom du module</entry></row>
<row><entry><constant>SQLite3::DROP_VTABLE</constant></entry><entry>Nom de la table</entry><entry>Nom du module</entry></row>
<row><entry><constant>SQLite3::FUNCTION</constant></entry><entry>&null;</entry><entry>Nom de la fonction</entry></row>
<row><entry><constant>SQLite3::SAVEPOINT</constant></entry><entry>Opération</entry><entry>Nom du point de sauvegarde</entry></row>
<row><entry><constant>SQLite3::RECURSIVE</constant></entry><entry>&null;</entry><entry>&null;</entry></row>
</tbody>
</tgroup>
</table>
</para>
<para>
Le quatrième paramètre sera le nom de la base de données (<literal>"main"</literal>,
<literal>"temp"</literal>, etc.) si applicable.
</para>
<para>
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.
</para>
<para>
Lorsque que la fonction de rappel retourne <constant>SQLite3::OK</constant>, cela signifie que l'opération
demandée est acceptée. Lorsque la fonction de rappel retourne <constant>SQLite3::DENY</constant>, l'appel qui a
déclenché l'autorisateur échouera avec un message d'erreur expliquant que
l'accès est refusé.
</para>
<para>
Si le code d'action est <constant>SQLite3::READ</constant> et que la fonction de rappel retourne
<constant>SQLite3::IGNORE</constant>, 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 <constant>SQLite3::OK</constant> avait été retourné.
Le retour de <constant>SQLite3::IGNORE</constant> peut être utilisé pour refuser à un utilisateur non fiable l'accès
à des colonnes individuelles d'une table.
</para>
<para>
Lorsqu'une table est référencée par un <literal>SELECT</literal> mais aucune valeur de colonne n'est extraite de
cette table (par exemple dans une requête comme <literal>"SELECT count(*) FROM table"</literal>), 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.
</para>
<para>
Si le code d'action est <constant>SQLite3::DELETE</constant> et que la fonction de rappel retourne
<constant>SQLite3::IGNORE</constant>, alors l'opération DELETE se poursuit mais l'optimisation de troncature est
désactivée et toutes les lignes sont supprimées individuellement.
</para>
<para>
Seul un seule autorisateur peut être en place sur une connexion de base de données à la fois. Chaque appel à
<methodname>SQLite3::setAuthorizer</methodname> remplace l'appel précédent. Désactivez l'autorisateur en installant
un rappel &null;. L'autorisateur est désactivé par défaut.
</para>
<para>
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.
</para>
<para>
Il est à noter que l'autorisateur n'est appelé que lorsqu une instruction est préparée, pas lorsqu'elle est
exécutée.
</para>
<para>
Plus de détails peuvent être trouvés dans la
<link xlink:href="&url.sqlite;c3ref/set_authorizer.html">documentation de SQLite3</link>.
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<variablelist>
<varlistentry>
<term><parameter>callback</parameter></term>
<listitem>
<para>
Le <type>callable</type> à appeler.
</para>
<para>
Si &null; est passé, cela désactivera le rappel de l'autorisateur actuel.
</para>
</listitem>
</varlistentry>
</variablelist>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
&return.success;
</para>
</refsect1>
<refsect1 role="errors">
&reftitle.errors;
<para>
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 <methodname>SQLite3::enableExceptions</methodname>).
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<example>
<title>Exemple de <methodname>SQLite3::setAuthorizer</methodname></title>
<para>
Ceci n'autorise que l'accès en lecture, et seuls certains colonnes de la table
<literal>users</literal> seront retournées. Les autres colonnes seront remplacées par
&null;.
</para>
<programlisting role="php">
<![CDATA[
<?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;'));
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Array
(
[id] => 1
[name] => Pauline
[password] =>
)
]]>
</screen>
</example>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->