2010-12-15 107 views
2

J'ai le code suivant, mais je pense que j'ai besoin de désinfecter les variables d'env, mais je ne sais pas exactement comment je devrais les aseptiser. Je réalise qu'il y a probablement une limite à ce que je peux les désinfecter, mais que puis-je faire?Comment désinfecter les variables d'environnement EDITOR, etc.

#!/usr/bin/perl 
use 5.012; 
use warnings; 
use autodie; 
use Env qw(EDITOR VISUAL); 
use File::Temp qw(:seekable); 

my $editor = '/usr/bin/nano'; 
if ($VISUAL) { 
    $editor = $VISUAL; 
} 
elsif ($EDITOR) { 
    $editor = $EDITOR; 
} else { 
    warn 'set VISUAL and EDITOR env variables not set falling back to nano' 
    . "\n"; 
} 

my $tmpf = File::Temp->new; 

system $editor, $tmpf->filename; 

open $tmpf, '<', $tmpf->filename; 

print while (<$tmpf>); 
+3

Jetez un coup d'œil à [perlsec] (http://perldoc.perl.org/perlsec.html) qui vous renseigne sur le mode "Taint". Le mode d'altération marquera comme corrompu toutes les données provenant de l'environnement en dehors de votre programme. Les données corrompues ne peuvent pas être réécrites dans l'environnement sans être nettoyées. Par exemple, que se passerait-il si "EDITOR" était réglé sur "rm -rf/& #"? –

Répondre

1

Je n'ai jamais fait quelque chose comme ça dans les scripts CGI, donc peut-être ce n'est pas du tout ce que vous cherchez; J'espère juste que ça va aider un peu. Voici une version modifiée de la sélection de caractères autorisés que j'ai utilisé, et une suggestion de code:

my $editor = '/usr/bin/nano'; 
    my $allowed = 'a-zA-Z0-9.\-_/'; 

    # this is what I did, but you will probably not want to do this... 
    #$file =~ s/[^$allowed]//go; # Remove every character thats NOT in the OK-list 

    # check that the variables contain only allowed characters 
    if ($VISUAL =~ m/^[$allowed]+$/) { 
     $editor = $VISUAL; 
    } 
    elsif ($EDITOR =~ m/^[$allowed]+$/) { 
     $editor = $EDITOR; 
    } 
    else { 
     # message 
    } 

    # The code I have given above should also leave $editor in its default 
    # state if neither $VISUAL nor $EDITOR has been set, as the condition 
    # will not be true for empty strings/undef values. 

De toute évidence, vous ne pouvez pas modifier les variables d'environnement si vous remarquez des caractères dans ceux qui vous pensez ne devrait pas être là (par exemple caractères qui ne sont pas dans la chaîne $ allowed), mais vous pouvez vérifier la présence de tels caractères et revenir sur votre éditeur par défaut dans un tel cas. Ceci est juste mon humble suggestion; peut-être un expert sur le sujet répondra dans un moment, et vous obtiendrez sa sagesse servi sur un plateau d'argent :)

+0

votre humble suggestion est conforme aux meilleures pratiques, comme imposé par le mode taint. – Narveson

0

L'utilisation de system avec plus d'un argument ne nécessite pas de désinfecter quoi que ce soit, car aucun shell sera invoqué. Vous pourriez vouloir vérifier si l'exécutable existe d'abord mais cela compliquera inutilement votre programme, et vous devrez regarder dans $PATH. En outre, les variables environnementales comme celles-ci sont généralement fiables. Toutefois, vous voudrez peut-être appeler le statut de sortie du système. Et vous pouvez essayer d'appeler $VISUAL d'abord, et si elle échoue, appeler $EDITOR (si $VISUAL est défini, $EDITOR est supposé agir comme un repli).

+0

Je suis sûr que les variables d'environnement sont plus sûres que, disons, l'entrée de l'utilisateur, mais elles ne sont pas sous votre propre contrôle, donc le questionneur a raison, c'est la meilleure pratique pour les désinfecter. – Narveson

+0

@Narveson: Cela soulève la question de savoir qui vous êtes quand vous parlez de quelque chose qui n'est pas sous votre contrôle. Si "vous" est celui qui exécute le code, alors il n'y a pas de problème. Si "vous" est une autre entité au nom de laquelle le code est exécuté, il s'agit d'une situation entachée. Tout est une question de perspective. Je ne vois aucune raison de blanchir votre variable éditeur; cela n'a aucun sens de mon point de vue. – tchrist

1

Pourquoi avez-vous besoin de les désinfecter du tout? Quel dommage va se produire si l'utilisateur de votre script a VISUAL="rm -f" et EDITOR à quelque chose d'autre bizarre? Vous vérifiez que l'opération de l'éditeur a réussi, que le fichier a été ouvert et que son contenu a du sens après la modification, avant que vous n'ayez fait quoi que ce soit de dangereux. Mais si l'utilisateur est seulement capable d'endommager ses propres fichiers (vous n'exécutez pas un système où ils peuvent endommager vos fichiers, n'est-ce pas?), Il n'est pas nécessaire de les désinfecter. Fournir un défaut est raisonnable; circonstances locales dictent si nano est un meilleur choix que, disons, vim.

Si l'utilisateur ne peut pas endommager votre matériel en abusant de VISUAL et EDITOR, alors je ne m'inquiéterais pas trop de leur choix d'endommager leurs propres choses.

Si vous écrivez quelque chose qui fonctionnera avec des privilèges augmentés - avec des privilèges SetUID ou SetGID, par exemple - alors vous devez vous en soucier beaucoup plus. (Le code Perl manque des vérifications qui sont plus fondamentales que de se préoccuper de l'éditeur.) Oh, mais cela signifie que le script annule automatiquement les erreurs, ce qui me semble être un peu radical. que cela ne gère pas system ou exec sauf si vous avez)

+0

+1 pour l'astuce autodie. – xenoterracide

1

Je pense que vous devez penser légèrement différemment à ce sujet. Après tout, votre script semble avoir besoin de l'interaction de l'utilisateur. Par conséquent, il ne serait pas déraisonnable de demander à l'utilisateur quel éditeur utiliser.Vous pouvez émettre un droit rapide avant d'exécuter l'éditeur comme dans:

Which editor would you like to use [/usr/bin/vi]?

où le défaut serait rempli de $ENV{EDITOR}, $ENV{VISUAL} ou si ni est défini, /usr/bin/nano. De cette façon, l'utilisateur peut juger si la valeur a du sens.

Si vous êtes paranoïaque sur l'endroit où $ENV{EDITOR} points, vous pourriez aussi avoir à être paranoïaque si une personne aurait pu mettre un exécutable malveillant sur le chemin de l'utilisateur et l'a nommé greateditor ou une telle.

+0

alors je devrais stocker les paramètres ... si je demandais, parce que je sais que je ne voudrais pas répondre à chaque fois ... et quelles sont ces variables, mais les paramètres – xenoterracide

+0

@xenoterracide C'est pourquoi je ne serais normalement pas inquiet assainir ces variables. Sûrement, un attaquant malveillant capable de modifier l'environnement de l'utilisateur aurait également pu modifier votre fichier de configuration. Cependant, si vous devez être paranoïaque, vous devrez peut-être imposer cet inconvénient à l'utilisateur. D'un autre côté, si vous avez besoin de ce niveau de paranoïa, il n'y a aucune garantie que '/ usr/bin/vi' soit' vi'. –