web-dev-qa-db-fra.com

Quels sont les privilèges requis pour exécuter une fonction de déclenchement dans PostgreSQL 8.4?

Quels sont les privilèges requis pour exécuter une fonction de déclenchement dans PostgreSQL 8.4?

Il semble que les privilèges fixés à un rôle ne comptent pas pour exécuter une fonction de déclenchement. Je pense avoir déjà vu que les privilèges requis pour exécuter une fonction de déclenchement sont le privilège exécuté, mais pour le propriétaire de la table, et non le rôle réel qui effectue l'action qui déclenche la gâchette qui appelle la fonction de déclenchement.

Je ne trouve pas la partie de la documentation qui explique ce point, aucune aide?

11
user18077

Les fonctions de déclenchement se comportent juste comme d'autres fonctions en ce qui concerne les privilèges. Avec une exception mineure:

Pour créer un déclencheur sur une table, l'utilisateur doit avoir le privilège TRIGGER sur la table. L'utilisateur doit également avoir EXECUTE privilège sur la fonction de déclenchement.

[~ # ~] Mise à jour [~ # ~] Après avoir révisé dans les commentaires que j'ai fait des recherches. Il y a un article ouvert à Todo dans le Wiki Postgres :

Serrer les contrôles d'autorisation de déclenchement

Liée à ce fil sur Postgres Hackers . Actuellement, EXECUTE Les privilèges sur une fonction de déclenchement ne sont cochés que sur Trigger Créer heure, mais pas au moment de l'exécution. Donc, révoquer l'exécution sur la fonction de déclenchement n'a aucun effet sur un déclencheur une fois créé. Votre observation semble être correcte.

Cela n'accorde aucun privilège supplémentaire pour manipuler des objets. Si le rôle d'appel ne dispose pas de privilèges nécessaires pour exécuter (parties de) l'organisme de fonction, l'exception habituelle est soulevée. Pour ouvrir la voie, vous pouvez faire un utilisateur privilégié OWNER de la fonction et utiliser le

SECURITY DEFINER

clause, comme documenté dans le manuel ici . Il provoque une fonction avec les autorisations du propriétaire au lieu de Invoker (par défaut).

Si le propriétaire est un superutilisateur, vous devez être très prudent que vous accordez au privilège EXECUTE et quelle fonction la fonction peut faire pour éviter les abus. Vous voudrez peut-être

REVOKE ALL ON FUNCTION foo() FROM public;

pour commencer et utiliser SET search_path Pour la fonction.
[.____] Assurez-vous de lire le chapitre sur écrire SECURITY DEFINER Fonctionne en toute sécurité .

Trouver A exemple de code dans cette réponse associée sur SO.

10
Erwin Brandstetter