39.5. 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 $$
my $tmpfile = "/tmp/badfile";
open my $fh, '>', $tmpfile
or elog(ERROR, qq{could not open the file "$tmpfile": $!});
print $fh "Testing writing to a file\n";
close $fh or elog(ERROR, qq{could not close the file "$tmpfile": $!});
return 1;
$$ LANGUAGE plperl;
La création de cette fonction échouera car le validateur détectera
l'utilisation par cette fonction d'une opération interdite.
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é, pour stopper une faille des
opérations privilégiées à partir de PL/PerlU vers PL/Perl, ces deux langages doivent être
exécutés dans des instances séparées de l'interpréteur Perl. Si
votre installation Perl a été compilé de façon approprié, ce
n'est pas un problème. Néanmoins, toutes les installations ne
sont pas compilées avec les options requises. Si PostgreSQL™ détecte que c'est le cas,
alors il n'exécutera pas le deuxième interpréteur mais lèvera une
erreur à la place. En conséquence, dans une telle installation,
vous ne pouvez pas utiliser à la fois PL/PerlU et PL/Perl dans le même processus serveur. Le
remède à ceci est d'obtenir une installation Perl créée avec les
options appropriées, nommément soit usemultiplicity soit usethreads et useithreads. Pour plus de détails, voir la page
man de perlembed.