L'accès à la table pg_statistic
est restreint aux
super-utilisateurs pour que les autres utilisateurs ne puissent apprendre le
contenu des tables des autres utilisateurs. Certaines fonctions
d'estimation de la sélectivité utiliseront un opérateur fourni par
l'utilisateur (soit l'opérateur apparaissant dans la requête, soit un
opérateur lié) pour analyser les statistiques enregistrées. Par exemple,
pour déterminer si la valeur la plus commune est applicable, l'estimateur
de sélectivité devra exécuter l'opérateur =
approprié
pour comparer la constante de la requête avec la valeur enregistrée. De ce
fait, la donnée dans pg_statistic
est
potentielement fournie aux opérateurs définis par l'utilisateur. Un
opérateur créé de façon approprié peut intentionnellement donner les
opérandes fournis (par exemple en les enregistrant ou en les écrivant dans
une table différente) ou en les exposant par erreur en affichant leur
valeurs dans des messages d'erreur, auxquels cas il pourrait exposer les
données provenant de pg_statistic
à un utilisateur
qui ne devrait pas être capable de les voir.
Pour empêcher cela, ce qui suit s'applique à toute fonction interne
d'estimation de la sélectivité. Lors de la planification d'une requête,
pour pouvoir utiliser les statistiques enregistrées, soit l'utilisateur
actuel doit avoir le droit SELECT
sur la table ou les
colonnes impliquées, columns, soit l'opérateur utilisé doit être
LEAKPROOF
(plus exactement, la fonction utilisée par cet
opérateur). Dans le cas contraire, l'estimateur de la sélectivité se
comportera comme si aucune statistique n'était disponible, et le
planificateur procédera avec les informations par défaut.
Si un utilisateur n'a pas le droit requis pour la table ou les colonnes, alors dans de nombreux cas, la requête renverra une erreur pour refus de droit, auquel cas ce mécanisme est invisible en pratique. Mais si l'utilisateur est en train de lire une vue avec une barrière de sécurité, alors le planificateur pourrait souhaiter de vérifier les statistiques de la table sous-jacente qui n'est normalement pas accessible par l'utilisateur. Dans ce cas, l'opérateur devra être sans fuite. Dans le cas contraire, les statistiques ne seront pas utilisées. Il n'y a pas de retour direct sur cela, en dehors du fait que le plan pourrait être non optimal. Si un utilisateur suspecte que cela lui arrive, il pourrait exécuter la requête avec un utilisateur disposant de plus de droits pour voir si cela cause la génération d'un autre plan.
Cette restriction s'applique seulement aux cas où le planificateur aurait
besoin d'exécuter un opérateur défini par un utilisateur sur une ou
plusieurs valeurs de pg_statistic
. De ce fait, le
planificateur a l'autorisation d'utiliser des informations statistiques
génériques, telles que la fraction de valeurs nulles ou le nombre de
valeurs distinctes dans une colonne, quelque soit les droits d'accès.
Les fonctions d'estimation de la sélectivité contenues dans des extensions de tierces parties qui opèrent potentiellement sur des statistiques avec des opérateurs définis par les utilisateurs devraient suivre les mêmes règles de sécurité. Consultez le code source de PostgreSQL pour des exemples.