Schrift
[thread]8772[/thread]

Open(): 2 args vs. 3 args

Leser: 1


<< >> 8 Einträge, 1 Seite
docsnyder
 2007-02-20 22:49
#74443 #74443
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hi!

Ich bevorzuge die Form "open(<filehandle>, <mode>, <filename>)" gegenüber "open(<filehandle>, "<mode> <filename>")", weiss aber nicht so richtig warum.

Wer kann mir sagen, warum Ersteres besser ist? (Ich hab' eben nur das Bauchgefühl, daß mas besser ist, aber ich weiss eben nicht warum.)

Any idea?

Gruss, Doc
nepos
 2007-02-21 00:56
#74444 #74444
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ich glaube, einer der Gründe war in Richtung Sicherheit. Aber sicher weiß ich es grade auch nicht.
topeg
 2007-02-21 07:17
#74445 #74445
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Es geht um Sicherheit richtig.

Stell dir vor du würdest eine Datei so öffnen lassen:
Code (perl): (dl )
1
2
3
my $filename=$ARGV[0];
# Datei lesend öffnen.
open($fh,$filename) or die "$!";

Du kannst nun an das script auch sowas übergeben:
Code: (dl )
script.pl '> wichtige_datei_zur_systemsicherung'

Das gibt keinen Fehler und leert die Datei.
Das kann dir mit der anderen Syntax nicht passieren.
bloonix
 2007-02-21 19:45
#74446 #74446
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=topeg,21.02.2007, 06:17]Du kannst nun an das script auch sowas übergeben:
Code: (dl )
script.pl '> wichtige_datei_zur_systemsicherung'

Das gibt keinen Fehler und leert die Datei.
Das kann dir mit der anderen Syntax nicht passieren.[/quote]
Naja, sowas kann einem auch mit '>' passieren:

Code: (dl )
1
2
3
script.pl wichige_datei_zur_systemsicherung

open $FH, '>', $ARGV[0];


Mich würde eher betrüben, dass man mit

Code: (dl )
open $FH, $ARGV[0];


Befehle ausführen kann.
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
betterworld
 2007-02-21 23:43
#74447 #74447
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Es soll ja nun nicht der Eindruck entstehen, dass man mit der 3-Argumente-Form von open generell unvertrauenswuerdige Dateinamen benutzen darf. Sachen wie "../../../" und so weiter sollte man immer herausfiltern.
Der Vorteil der 3-Argumente-Form ist eben, dass man Dateinamen in Variablen schreiben kann und sich drauf verlassen kann, dass sie wirklich nur als Dateinamen behandelt werden. Wenn man nicht gerade einen Einzeiler hackt oder eine gute Begruendung weiss, sollte man bei solchen Sachen lieber alles explizit angeben, sonst kann es implizite Ueberraschungen geben.
Strat
 2007-02-22 15:29
#74448 #74448
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
beim zwei-parametrigen open ist immer das Problem, dass man damit auch externe Kommandos ausfuehren kann, z.B.
Code: (dl )
1
2
3
4
my $command = "ls -la";
open( my $CMD, "$command |" ) or die $!;
my @lines = <$CMD>;
close $CMD;

wenn man zum lesen einer Datei folgendes verwendet:
Code: (dl )
1
2
3
open( my $FH, $filename ) or die $!;
my @content = <$FH>;
close $FH;

und $filename kann von einem Benutzer angegeben werden, kann dies auch folgenden Inhalt haben:
Code: (dl )
$filename = "ls -la |";


durch voranstellen eines < kann man das entschaerfen, aber das wird oft vergessen.
Code: (dl )
open( my $FH, "<$filename" ) or die $!;


Beim drei-argumentigen open ist es IMHO schwieriger, das < oder > zu vergessen, d.h. externe Kommandos koennen nicht so einfach ausgefuehrt werden.

@betterworld: gefaehrliche sachen herauszufiltern halte ich i.d.R. fuer keine gute Loesung, weil man da leicht was potentiell gefaehrliches zu entfernen vergisst. besser definieren, welche Zeichen gueltig sind und dann ueberpruefen, ob auch nur die vorkommen.
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
betterworld
 2007-02-22 16:08
#74449 #74449
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
[quote=Strat,22.02.2007, 14:29]@betterworld: gefaehrliche sachen herauszufiltern halte ich i.d.R. fuer keine gute Loesung, weil man da leicht was potentiell gefaehrliches zu entfernen vergisst. besser definieren, welche Zeichen gueltig sind und dann ueberpruefen, ob auch nur die vorkommen.[/quote]
Da hast Du in der Tat recht.  Wenn ich beispielsweise in einer Webanwendung Dateien schreibe, verwende ich auch nie Namen, die vom Benutzer gegeben sind, sondern lieber aufsteigende Nummern oder aehnliches.

Ich wollte eben nur zum Ausdruck bringen, dass die Drei-Argumente-Form niemanden vor boesen Dateinamen bewahrt (wobei ich sie trotzdem dringend der Zwei-Argumente-Form bevorzuge).\n\n

<!--EDIT|betterworld|1172153344-->
Strat
 2007-02-22 16:31
#74450 #74450
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=betterworld,22.02.2007, 15:08]Ich wollte eben nur zum Ausdruck bringen, dass die Drei-Argumente-Form niemanden vor boesen Dateinamen bewahrt[/quote]
Dem wollte ich auch nicht widersprechen... Haette vielleicht oben besser anstelle von @betterworld @all schreiben sollen...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< >> 8 Einträge, 1 Seite



View all threads created 2007-02-20 22:49.