Re: perlsec à l'aide

Page principale

Répondre à ce message
Auteur: Edgar Bonet
Date:  
À: Liste Guilde
Sujet: Re: perlsec à l'aide
[
    Au reste de la liste : si des gens sont intéressés par cette
    discussion sur le taint mode, faites-le nous savoir. Sinon je
    suggère qu'on passe en mails privés.
]


Le mardi 25 janvier, Anne Aublanc a écrit :
> J'ai réussi à faire fonctionner les pgms mais 1 ligne c'est transformé
> en x lignes (quelques dizaines!) :
>
> system "$g3topbm -f $fax_directory/$sfilename | $pnmtops >
> $webtmpabs/$$.f.$tfilename.ps"; # (1)
> cette ligne transforme un fichier g3 (fax) en ps en passant par un fichier
> pbm
>
> J'ai donc transformé cette ligne avec :
> [...plein de choses compliquées...]
> ma question : est-ce-que j'aurais pu continuer la cde 1...


À priori oui. J'ai fait le test suivant :

    #!/usr/bin/perl -wT
    %ENV = ("PATH" => "/bin:/usr/bin");
    system "ls | cat > foobar";


et ça marche sans problème. Donc tu peux faire des system() avec des
pipes et des redirections sans que l'option -T ne vienne t'embêter.

> Selon perlsec :
> system "echo $arg";         # Non sûr
> system "/bin/echo", $arg;   # Sûr (n'utilise pas sh)


On n'a pas fait la même lecture de man perlsec. J'ai lu :

           $arg = shift;               # $arg est souillée
           [...]
           system "echo $arg";         # Non sûr


Il faut comprendre que quand le man dit « Par exemple : », les commandes
qui suivent forment une suite logique, un seul exemple, et non des
exemples indépendants. Dans le cas ci dessus, « system "echo $arg"; »
est non sûr parce que $arg est souillé (et l'environnement aussi
d'ailleurs).

Normalement, la façon d'écrire un CGI est la suivante :

  - au début du script tu nettoies tout ce qui vient de l'extérieur :
    paramètres CGI, arguments, entrée standard, environnement... tout ce
    que tu vas utiliser par la suite ;


  - ensuite tu programmes de la façon qui te semble la plus naturelle,
    sans contorsions.


Le « taint mode » n'est là que pour te prévenir au cas où tu aurais
oublié quelque chose à la première étape. Pour ma part, s'il ne me
l'avait pas dit, j'aurais oublié $ENV{IFS} par exemple. Si perl -T te
dit qu'une commande n'est pas sûre, ÇA NE VEUT PAS DIRE QU'IL FAUT LA
MODIFIER (excuse-moi de crier), ça veut le plus souvent dire qu'elle
utilise des paramètres que tu as oublié de nettoyer.

Dans ton cas, utilise la commande (1) si ça te plaît comme ça, mais
assure-toi d'abord que $g3topbm, $fax_directory, $sfilename, $pnmtops,
$webtmpabs, $tfilename et %ENV sont propres.

Encore deux conseils :

  - ne fais JAMAIS dans un programme une modification que tu ne
    comprends pas ;


- utilise « perl -wT » et pas seulement « perl -T ».

Bonne continuation,

Edgar.

-- 
Edgar Bonet           Maison : 04 76 21 29 16    Bureau : 04 76 88 10 96
3 rue Jean Prévost    Mobile : 06 77 19 79 39    Fax    : 04 76 88 11 91
38000 Grenoble        guilde@???     www.edgar-bonet.org