[gull] probleme avec python et l'execution d'un programme externe

Marc SCHAEFER schaefer at alphanet.ch
Wed Feb 8 10:11:26 CET 2006


On Tue, Feb 07, 2006 at 11:27:59PM +0100, Christian Kaenzig wrote:
> Je m'y perd moi-même avec tous ces exec différents, mais comme l'a dit Daniel, 
> un os.system("cnvimage "+paramètres) va très bien pour ça.

La différence entre exec*(2) et system(3), à part le fait qu'exec est un
system-call et system() est implémenté par la bibliothèque C standard, est que
system retourne au programme appelant (system() == fork(2) puis exec()
dans le fils et wait*(2) dans le père).

L'autre différence principale est que system(), en règle générale et pour
tous les langages, est implémenté sous UNIX (au minimum) comme un
passage de paramètre au shell.  Il faut donc s'assurer que les
paramètres de system() sont filtrés (éviter $, `, ;, [ et probablement
d'autres méta-caractères du shell).

Sinon, en particulier lorsque les paramètres proviennent de
l'utilisateur ou d'une base de données, on risque des problèmes de
sécurité, notamment l'injection de commandes avec ';'.

exec*() n'a pas ce problème.

En Perl, la différence est fondamentale entre:

   system($string)

et

   system(@array)  # équivalent à system($str1, $str2, ...)

Dans le premier cas, si des métaractères du shell sont présents, Perl
exécute via '/bin/sh -c'. Dans le deuxième cas, c'est équivalent à un
exec + fork(), il n'y a donc pas de risques liés au shell (sauf si on
lance un shell explicitement).

Notons aussi que l'ouverture de pipe à des commandes, p.ex.

   if (open(FILE, '|/usr/sbin/sendmail -f moi at truc.org ' . $dest)) {
      print FILE $mail_content;

est géré via le shell.  S'assurer que les paramètres (p.ex. dest) sont
filtrés.




More information about the gull mailing list