Alexander (HH): -T Taintcheck OK auf Windows NOT OK auf UNIX

Beitrag lesen

Moin Moin!

Zeig Code. Wenigstens die Stelle, die Perl in der Fehlermeldung bemängelt. Und die Fehlermeldung natürlich auch.

OK.
Ich habe jetzt einen Fehlerreport
Betrifft dies:

open( my $LOG2, '>', $Files{logfile} ) or die("$!");


>   
> Es handelt sich um den einzigen Schreibzugriff.  

Nö, an der Stelle machst Du ein open(), keinen Schreibzugriff.  
  
Warum muß ich mir den Code rekonstruieren?  
  
Und warum gibst Du nicht alle relevanten Variablen an?  
  
Woher kommt $Path{'homedir'}? Wenn ich mir das aus $ENV{'HOME'} hole, ist $Files{'logfile'} tainted. Und zwar nur unter Unix, weil Windows $ENV{'HOME'} nicht setzt.  
  

> Wie zu sehen wird zwar $0 verwendet, aber $0 wird auf jeden Fall über eine RE gewaschen.  
  
Nö, Du kannst SO nicht waschen. $0 bleibt tainted, bis Du es ÜBERSCHREIBST, und wenn Du noch so oft matcht. Nur die RE-Puffer ($1, $2, ...) sind vom Tainting explizit ausgenommen.  
  

> Da ist kein Grund, dass diese Pfade tainted sein dürfen.  
>   
> Und wieder meine Frage: Warum auf UNIX und nicht auf Windows?  
  
S.o.  
  
Das ist meine Rekonstruktion Deines Codes, zusammen mit expliziten Taint-Ausgaben. Und die sagt, dass $Files{'logfile'} am Ende tainted ist. Demzufolge verweigert open() die Arbeit und wirft stattdessen eine Exception.  
  
~~~perl
  
#!/usr/bin/perl -T  
  
use strict;  
use warnings;  
  
use Data::Dumper qw();  
use Scalar::Util qw(tainted);  
  
sub T  
{  
	my ($name,$val)=@_;  
	my $line=(caller())[2];  
	print "$name is ",tainted($val) ? "" : "not ","tainted in lline $line (value=".Data::Dumper::qquote($val).")\n";  
}  
  
  
my %Path=( #defaults  
#	...  
	scriptpath => $0,  
	homedir => $ENV{'HOME'},  
);  
  
T(scriptpath => $Path{'scriptpath'});  
  
open( my $config, '<','config.ehf' ) or die ("Kann nicht config.ehf lesen $!");  
while(<$config>){  
	T('$_' => $_);  
	/^scriptpath\s*=\s*"([^"]+)"/ and $Path{scriptpath}=$1 and next;  
}  
close $config;  
  
T(scriptpath => $Path{'scriptpath'});  
  
$Path{scriptpath} =~ s#\\#/#g;  
  
T(scriptpath => $Path{'scriptpath'});  
  
($Path{root},$Path{cgi},$Path{scriptname})=($Path{scriptpath}=~m!^ (.*?/) ($Path{cgidir}/\w+/) ([a-z]+\.pl)$!x);  
  
T(scriptpath => $Path{'scriptpath'});  
T(scriptname => $Path{'scriptname'});  
T(root => $Path{'root'});  
T(cgi => $Path{'cgi'});  
  
$Path{__datadir} = $Path{homedir} . '/' . '__data/';  
  
T(__datadir => $Path{'__datadir'});  
  
$Path{homedir} = $Path{root} . $Path{htmldir} .'/'. $Path{ehfdatadir};  
  
T(homedir => $Path{'homedir'});  
  
my %Files;  
$Files{'logfile'}=$Path{__datadir} . 'log.ehf';  
  
T(logfile => $Files{'logfile'});  
  
open( my $LOG2, '>', $Files{logfile} ) or die("$!");  

Möchtest Du das Log übrigens wirklich jedes Mal plätten?

Alexander

--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".