39.4. Niveaux de confiance de PL/Perl

Normalement, PL/Perl est installé en tant que langage de programmation de << confiance >>, de nom plperl. Durant cette installation, certaines commandes Perl sont désactivées pour préserver la sécurité. En général, les commandes qui interagissent avec l'environnement sont restreintes. Cela inclut les commandes sur les descripteurs de fichiers, require et use (pour les modules externes). Il n'est pas possible d'accéder aux fonctions et variables internes du processus du serveur de base de données ou d'obtenir un accès au niveau du système d'exploitation avec les droits du processus serveur, tel qu'une fonction C peut le faire. Ainsi, n'importe quel utilisateur sans droits sur la base de données est autorisé à utiliser ce langage.

Voici l'exemple d'une fonction qui ne fonctionnera pas car les commandes système ne sont pas autorisées pour des raisons de sécurité :

CREATE FUNCTION badfunc() RETURNS integer AS '
    open(TEMP, ">/tmp/mauvaisfichier");
    print TEMP "Je t'ai eu !\n";
    return 1;
' LANGUAGE plperl;

La création de cette fonction va réussir, mais pas son exécution.

Il est parfois souhaitable d'écrire des fonctions Perl qui ne sont pas restreintes. Par exemple, on peut souhaiter vouloir envoyer des courriers électroniques. Pour supporter ce cas de figure, PL/Perl peut aussi être installé comme un langage << douteux >> (habituellement nommé PL/PerlU ). Dans ce cas, la totalité du langage Perl est accessible. Si la commande createlang est utilisée pour installer le langage, le nom du langage plperlu sélectionnera la version douteuse de PL/Perl.

Les auteurs des fonctions PL/PerlU doivent faire attention au fait que celles-ci ne puissent être utilisées pour faire quelque chose de non désiré car cela donnera la possibilité d'agir comme si l'on possédait les privilèges d'administrateur de la base de données. Il est à noter que le système de base de données ne permet qu'aux super-utilisateurs de créer des fonctions dans un langage douteux.

Si la fonction ci-dessus a été créée par un super-utilisateur en utilisant le langage plperlu, l'exécution de celle-ci réussira.

Note : Pour des raisons de sécurité, afin de stopper une faille dans les opérations nécessitant des droits de PL/PerlU dans PL/Perl, ces deux langages doivent être exécutés dans des instances séparés de l'interpréteur Perl. Si votre installation Perl a été compilé correctement, ce n'est pas un problème. Néanmoins, toutes les installations ne sont pas compilées avec les drapeaux nécessaires. Si PostgreSQL détecte que c'est le cas, il ne lancera pas un deuxième interpréteur mais renverra une erreur. En conséquence, pour ce type d'installation, vous ne pouvez pas utiliser à la fois PL/PerlU et PL/Perl dans le même processus serveur. Le remède est d'installer un interpréteur Perl compilé avec les bons drapeaux, à savoir soit usemultiplicity soit usethreads et useithreads. Pour plus de détails, consultez la page de manuel de perlembed.