Schrift
[thread]282[/thread]

RegEx Problem bei Test auf richtige File-Extension

Leser: 1


<< |< 1 2 >| >> 20 Einträge, 2 Seiten
cbxk1xg
 2004-06-06 05:42
#2699 #2699
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Hallo Freunde der Sonne,

Ich habe mir bei meinem kleinen Uploadscript jetzt folgendes zusammengereimt:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
use CGI qw/:standard/;
my $UploadDir = $TEMP_DIR;
$CGI::POST_MAX=1024 * $MaxSize;

my ($filename) = param('attachment') || "undefined";

my $serverFile = $UploadDir . "/" .
(split(/[\\\/]/, param('attachment')))[-1];

# Datei umbenennen mit Zufallszahl
$RandomID = sprintf("%d%d",time,rand(999999));
$serverFile =~ s-(.*?)\.(.*?)-$RandomID.Ū-g;

my $tempfile = "$UploadDir/$serverFile";

# Testen ob die Extension erlaubt ist.
$Extensions = '.gif .GIF .jpg .JPG .pdf .PDF .png .PNG .zip .ZIP';
# In der folgenden Zeile steckt wohl der Fehler...
if (grep($serverFile,$Extensions,(split/\./,$_))) {&program_error("The extension of the file is not valid.");}

if (-e $tempfile) {&program_error("File is already existing. $!");}

else
{
my $buffer;
open (FILE,">$tempfile");
#binmode(FILE); # Windows OS hack
#binmode $filename; # Windows OS hack
while (my $bytesread=read($filename,$buffer,1024)) {print FILE $buffer;}
close (FILE);
}

chmod (0744, "$tempfile");

# Nur zum Test
print "Content-type:text/html

";
print "Upload succeed.
";
exit;


Ich will natürlich verhindern das irgendein Spaßvogel .exe oder .vb Dateien hochlädt und wollte nun eigentlich mit...
Code: (dl )
if (grep($serverFile,$Extensions,(split/\./,$_))) {&program_error("The extension of the file is not valid.");}

testen, ob die Dateiendung erlaubt ist. Dabei wollte ich die Dateiendungen ganz bewusst in $Extensions speichern, weil ich diese Variable später in einer externen Config-Datei speichern will. Leider bringt mein Code immer ein negatives Erbniss, selbst wenn die Dateiendung erlaubt ist.

Des weiteren wollte ich eigentlich noch testen, ob der Dateiname komische Zeichen enthält wie etwa : !"§$%&/()=?`; Dazu fällt mir aber nix gescheites ein außer:
Code: (dl )
if($serverFile !~ /^[a-z\.\-_]+?\.([a-z]{3})$/) {&bla;}
\n\n

<!--EDIT|cbxk1xg|1086486225-->
steinwolf
 2004-06-06 13:47
#2700 #2700
User since
2003-08-04
367 Artikel
BenutzerIn
[default_avatar]
Sollte Extensions nicht ein Array sein??
Dann kannste dir das splitten sparen


steinigen..

edit:
sry, hatte nicht bis zum ende gelesen.
aber wo ist das problem ein array wie ein skalar in einer config zu speichern??\n\n

<!--EDIT|steinwolf|1086515360-->
"Did you know? You can use your old motor oil to fertilize your lawn." - Blinkster - Professionelles EDV Forum
renee
 2004-06-06 14:13
#2701 #2701
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du splittest am Punkt. Dadurch gehört das Leerzeichen noch zur Extension. Und Du wirst sicherlich keine Datei haben, bei der ein Leerzeichen noch am Ende der Extension ist, oder??

Außerdem solltest Du noch Zahlen in den erlaubten Dateinamen berücksichtigen!
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
cbxk1xg
 2004-06-06 15:33
#2702 #2702
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
[quote=renee,06.06.2004, 12:13]Außerdem solltest Du noch Zahlen in den erlaubten Dateinamen berücksichtigen![/quote]
Stimmt.

Aber das alles löst auch nicht mein Problem. Ich denke das die RegEx richtig ist, aber die Syntax in Verbindung mit dem Prüfen auf die Dateiendungen, in dem String $Extensions irgendwie nicht stimmt.

Code: (dl )
if (grep($serverFile,$Extensions,(split/\./,$_)))
\n\n

<!--EDIT|cbxk1xg|1086521681-->
Gast Gast
 2004-06-06 16:40
#2703 #2703
So sollte es eigentlich funktionieren
Code: (dl )
1
2
3
4
5
# Testen ob die Extension erlaubt ist.
my @Extensions = ('gif', 'jpg', 'pdf', 'png', 'zip');
my $ext = (split /\./, $serverFile)[1];

program_error("The extension of the file is not valid.") unless grep /$ext/i, @Extensions;
renee
 2004-06-06 16:43
#2704 #2704
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Hast Du Dir auch durchgelesen, was ich über dem Kommentar mit den Zahlen geschrieben habe??

Edit:
PS: Du würdest besser am Leerzeichen splitten...\n\n

<!--EDIT|renee|1086525859-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Gast Gast
 2004-06-06 17:16
#2705 #2705
@renee
Verstehe ich jetzt nicht ...
wo soll denn das Leerzeichen herkommen und wie sollte über einen Leerzeichen-Split die Extension (so denn eine vorhanden ist) ermittelt werden können?
cbxk1xg
 2004-06-06 17:25
#2706 #2706
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
[quote=renee,06.06.2004, 14:43]Hast Du Dir auch durchgelesen, was ich über dem Kommentar mit den Zahlen geschrieben habe??

Edit:
PS: Du würdest besser am Leerzeichen splitten...[/quote]
Ich hab's verstanden. Somit hätte Ich immer Dateiendungen die ein Leerzeichen enthalten.

An Dieter: das /i steht für case ignore, oder?
hephaistos
 2004-06-06 17:28
#2707 #2707
User since
2004-06-06
9 Artikel
BenutzerIn
[default_avatar]
ja /i steht für case insensitivity.

ciao
cbxk1xg
 2004-06-06 17:29
#2708 #2708
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Noch ne Frage: Wofür steht das [1] bei my $ext = (split /\./, $serverFile)[1];
<< |< 1 2 >| >> 20 Einträge, 2 Seiten



View all threads created 2004-06-06 05:42.