Leser: 25
QuoteInsecure dependency in open while running with -T switch at C:/xampp/htdocs/mail/cgi-bin/mail.pl line 24.
QuoteUnsichere Abhängigkeit bei der Nutzung von "open", beim ausführen mit dem -T-Schalter in C:/xampp/htdocs/mail/cgi-bin/mail.pl Zeile 24.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
#!/usr/bin/perl -T use strict; use warnings; use CGI; my $cgih = CGI->new(); my $filename = $cgih->param('dateiname'); if ($filename =~ /^([a-z]+)(\.[a-z]+)?$/i ) { # es werden nur Dateinamem aus Buchstaben mit Punkt und Buchstaben für den Dateityp zugelassen my $sauberer_dateiname = "$1$2"; # durch die Prüfung ist das Ergebnis "sauber" (untainted) my $fh; open($fh, '>', $sauberer_dateiname) or die "$!"; print $fh "Datei: $sauberer_dateiname\n"; # Datei weiterverarbeiten close ($fh) or die "$!"; } else { die ("Ungültiger Dateiname $filename"); }
1 2 3 4 5
my $var = ...; if ($var =~ m/(sane regex)/) { $var = $1; } else { die ... }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
> perl -T -E'use Devel::Peek; my ($foo) = @ARGV; Dump $foo; my ($u) = $foo =~ /(b)/; Dump $u' blah
SV = PVMG(0x8be4b0) at 0x8c3098
REFCNT = 1
FLAGS = (PADMY,GMG,SMG,pPOK)
IV = 0
NV = 0
PV = 0x8a65d0 "blah"\0
CUR = 4
LEN = 8
MAGIC = 0x8c6b40
MG_VIRTUAL = &PL_vtbl_taint
MG_TYPE = PERL_MAGIC_taint(t)
MG_LEN = 1
SV = PV(0x88bc30) at 0x8c3128
REFCNT = 1
FLAGS = (PADMY,POK,pPOK)
PV = 0x8f2f50 "b"\0
CUR = 1
LEN = 8
Guest anonIn der Regel vermeidet man $1 und Freunde.
1 2 3 4 5
if (my (@captures) = $expr =~ /regex/) { # do something with @captures } else { # did not match }
Guest anonsollte doch der Schluss naheliegen, dass mittels direkter Zuweisung der komplette Verzicht auf $1 kein Risiko birgt‽
QuoteWenn einem defensive Programmierung am Herzen liegt, fällt die Entscheidung zwischen den Möglichkeiten nicht schwer.
QuoteDie Gültigkeitsabfrage (gerne unterschlagen,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
if ($filename =~ m/(...)/) { $filename = $1; # weiter } else { die ...; } # vs. my ($untainted) = $filename =~ m/(...)/; if ($untainted) { # weiter } else { die ...; }
QuoteImmer, wenn ein Pythonista so ein $1 liest, lacht er innerlich,
QuoteAls Anhänger von Perl sollte man moderne Praktiken propagieren
1 2 3 4 5
if (my (@captures) = $expr =~ /regex/) { # do something with @captures } else { # did not match }
1 2 3 4 5 6
if (my (@captures) = $expr =~ /(abc)ijk(def)lmn/) { # do something with @captures print "Daten $captures[0] sind vor $captures[1]"; } else { # did not match }
Guest anon[*]Bei Veränderungen der Reihenfolge oder Anzahl der Captures braucht man nicht so viel Aufwand mit der Wartung.
1 2 3 4 5 6 7 8 9 10
my $str1 = "Number 123"; $str1 =~ m/\A (?<word> \w+ ) \s+ (?<number> \d+ ) \z /xms; my %m1 = %+; my $str2 = "Foobar 456"; $str2 =~ m/\A (?<word> \w+ ) \s+ (?<number> \d+ ) \z /xms; my %m2 = %+; print "Match1: ", Dumper(\%m1), "\n"; print "Match2: ", Dumper(\%m2), "\n";
1
2
3
4
5
6
7
8
9
Match1: $VAR1 = {
'word' => 'Number',
'number' => '123'
};
Match2: $VAR1 = {
'word' => 'Foobar',
'number' => '456'
};
Quote[*]Immer, wenn ein Pythonista so ein [tt]$1[/tt] liest, lacht er innerlich, wie rückständig Perl doch ist.
Quote(Python hatte benannte Captures, die ganz offensichtlich besser in der Handhabung sind, wesentlich länger als Perl.)
QuoteAls Anhänger von Perl sollte man moderne Praktiken propagieren, um Zusammenhalt und Mindshare für die Zukunft zu sichern; wir kriegen schließlich nicht Millionen Dollar von Sugardaddy Google in den Arsch geblasen.
QuoteWeil Python Fehler hat, schmälert es nicht die Fehler von Perl.auch Python hat genug Probleme. Zum Beispiel muss Python
QuoteJa… danke…? Gibt's einen Grund für diese Erörterung? Ich weiß bereits, was sie sind, sonst würde ich ja nicht darüber reden.Die [benannten Captures] habe ich dir oben übrigens geliefert.
QuoteDu argumentierst mit dem Ergebnis. Tatsächlich sind die Eigenschaften von Perl nicht unveränderlich.Trotzdem ist Perl keine Sprache wo sich jeden Monat etwas ändert
QuoteEin Datum ist kein Positivbeleg; anders gesagt, nicht alle 20 Jahre alte Quellen laufen noch auf 5.10.ein 20 jahre altes Perl 1 Skript [soll] noch auf Perl 5.10 laufen
QuoteDann rate ich dringend von der Lektüre von perldelta ab, oder es dürfte dir den Appetit auf Perl auf immer verderben. Es hat viele Änderungen, davon so viele inkompatibel, dass ich sie nicht mehr an Händen und Füßen zählen kann. Daher ist das Argument mit dem kritischen Code ungültig; lebendiger Code wird gewartet und an moderne Bedürfnisse angepasst, spätestens dann, wenn eine inkompatible Änderung es erzwingt.Python das alle Nase lang [… tiefgehende…] änderungen erlebt […] würde mir nicht all zu sehr gefallen.
QuoteDu unterschlägst den optimalen Ansatz mittels direkter Zuweisung!Ansonsten schaut die Alternative aus, lediglich mit $1 zu leben, und sich einfach zu mercken wenn man einen Capture Parameter nutzen möchte diesen danach einer Variablen zuzuweisen.
QuoteTatsächlich ist es unnötig komplex. Das eigentliche Problem ist, dass mehrere Dutzende kleiner solcher schlechter Termini, die in einem Programm zusammenkommen, die Divergenz der Absicht des Programmierers und dessen, was wirklich passiert, dramatisch erhöhen. Daher sollte jedem daran gelegen sein, nicht die Folgen des Vermeidens, oder wenn möglich, Ausmerzens kleiner Altlasten zu unterschätzen.Das halte ich nicht für besonders komplex
QuoteGleichzeitig schafft es Nebenwirkungen und erhöht damit die Fehleranfälligkeit. Noch einmal mein ursprüngliches Argument: direkte Zuweisung trägt nicht das Risiko von Nebenwirkungen!und löst die Probleme
QuoteNiemanden interessiert Abwärtskompatibilität mit Perl 2, als $1 erschien. Niemanden interessiert die Abwärtskompatibilität mit 5.003, welches der früheste Zeitpunkt ist, für den ich einen Beleg für die Existenz der Syntax direkter Zuweisung finden konnte.und bewahrt gleichzeitig die Abwärtskompatibilität.
QuoteSyntax und daraus entstehende Idiome sind nicht low-level, das ist high-level und sehr wohl relevant. Ein Beispiel für ein low-level-Detail wäre, dass ein String-Skalarwert einen Slot namens PV implementiert und u.U. ein Flag namens pPOK hat.solches "low-level" zeug
Guest anonNoch einmal mein ursprüngliches Argument: direkte Zuweisung trägt nicht das Risiko von Nebenwirkungen!
QuoteWeil Python Fehler hat, schmälert es nicht die Fehler von Perl.
QuoteEin Datum ist kein Positivbeleg; anders gesagt, nicht alle 20 Jahre alte Quellen laufen noch auf 5.10.
QuoteDu unterschlägst den optimalen Ansatz mittels direkter Zuweisung!
QuoteGleichzeitig schafft es Nebenwirkungen und erhöht damit die Fehleranfälligkeit.
QuoteNiemanden interessiert Abwärtskompatibilität mit Perl 2, als $1 erschien.
1
2
3
> perl -T -MScalar::Util=tainted -E'my ($foo) = @ARGV; say q(foo tainted? ) . tainted $foo; my ($u) = $foo =~ /(b)/; say q(u tainted? ) . tainted $u;' blah
foo tainted? 1
u tainted? 0
2010-01-15T10:34:26 GwenDragonIst zum Glück ja kein sicherheitsrelevanter Code für einen Airbus oder die ISS. ;)