hi,
Perl kann ich nicht verwenden, also ich, mein Server schon, wäre mir aber auch zu kompliziert, jetzt noch Perl mit ins Spiel zu bringen.
Wer sagt denn "auch"? "Nur"! ;-)
Hatte ich in China schon halb durch, nur, nach meiner Rückreise verfiel leider dem einfacheren PHP, Perl ist für's Web einfach zu kompliziert (oder für mich) :)
Soll heißen:
#!/usr/bin/perl -T -w
use strict;
use CGI qw(param);
delete @ENV{qw(IFS CDPATH ENV BASH_ENV)}; # "böse" Environment-Variablen, alle tainted, bis sie beseitigt wurden
$ENV{'PATH'}='/bin:/usr/bin'; # $ENV{'PATH'} ist normalerweise tainted, jetzt nicht mehr. Konstanten im Script sind nicht tainted.
my $app=param('app');$app ist tainted, da aus $ENV oder STDIN abgeleitet
$app=~m|^(/usr/safe-for-web/bin/[a-z]{3,8})$| or die "Hack mich nicht!";
$app=$1; # $1 ist der Match innerhalb der Klammern, und per Definition untainted. Ohne diese Zeile bleibt $app tainted und exec stirbt.
exec $app; # stirbt nicht, da Environment und alle Parameter untainted sindDafür kann das Script nur Programme in /usr/safe-for-web/bin ausführen, deren Name aus drei bis acht Kleinbuchstaben besteht.
Danke für das Beispiel, ich hoffe, irgendwann lerne ich auch mal eine anständige Programmiersprache[1] :)
mfg
[1] Das ich damit nichts anfangen kann, brauch ich ja nicht erwähnen, auch, wenn mir der ein oder andere Begriff bekannt vorkommt :)
--
[I have a Dream...](http://www.myvideo.de/watch/2503116/I_have_a_dream_Will_I_AM_feat_Common)