Probleme beim Überprüfen einer Grafik
Markus Trusk
- perl
Hola,
Durch die Tatsache, dass mein Uploadscript umgangen werden konnte, und eine .zip Datei als unbenannte .jpg hinaufgeladen werden konnte, will ich jetzt noch zusätzlich alle Uploads mit Image::Size überprüfen. Zu Testzwecken habe ich mal ein kleines Script ausprobiert:
#!/usr/bin/perl -w
use strict;
use Image::Size;
my ($x, $y) = imgsize('Party.jpg');
($x || $y) eq undef ? print "Undefiniert" : print "$x x $y\n";
Will ich mir die Größe von einer "richtigen" Grafik ausgeben lassen, funktioniert es. Habe ich allerdings eine Grafik, die keine ist, bekomme ich folgende Meldung:
Use of undef without parens is ambiguous....
Schreibe ich '' statt undef bekomme ich: Use of uninitialized value in string line 8.
Dann habe ich das Script noch so geändert:
#!/usr/bin/perl -w
use strict;
use Image::Size;
my ($x, $y) = ('','');
($x, $y) = imgsize('Party.jpg');
($x || $y) eq '' ? print "Undefiniert" : print "$x x $y\n";
..aber die Fehlermeldung ist noch immer die gleiche? Weiß jemand wie man das Problem am Besten lösen kann?
P.S Er schreibt mir zwar die Ausgabe "Undefiniert" zusätzlich zur Fehlermeldung hin, aber ich will, dass es ohne Fehlermeldung funktioniert.
Markus Trusk.
Hallo,
Durch die Tatsache, dass mein Uploadscript umgangen werden konnte, und eine .zip Datei als unbenannte .jpg hinaufgeladen werden konnte, will ich jetzt noch zusätzlich alle Uploads mit Image::Size überprüfen.
ich kann dir zwar bei Image::Size nicht helfen, aber dir zumindest zeigen, wie ich den Test auf JPEG-Format durchführe:
my $fh = $q->upload('signature');
if (defined $fh && ! $error) {
my $buffer;
$tempfile = md5_base64 ($vars{prename} . $vars{name} . $vars{mail} . rand(10));
$tempfile =~ s!/!!g;
$tempfile =~ s!\!!g;
open TEMPFILE, ">$tempfile" or die "Opening temporary file $tempfile: $!";
binmode TEMPFILE;
while (read ($fh, $buffer, 1024)) {
print TEMPFILE $buffer;
}
close TEMPFILE;
my $size = (stat $tempfile)[7];
if ($size > 50 * 1024) { $error .= "Die Unterschriftendatei darf maximal 50 KB groß sein\n"; }
unless ($error) {
my $mm = new File::MMagic;
my $mime = $mm->checktype_filename($tempfile);
if ($mime ne 'image/jpeg') { $error .= "Die Unterschrift muss als JPEG Bild hochgeladen werden. Die gewählte Datei wurde als $mime erkannt.\n"; }
}
unlink $tempfile if ($error);
}
Wenn du danach weißt, dass es ein JPEG Bild ist, dann kannst du ja Image::Size drauf loslassen und es sollte klappen.
Viele Grüße,
Stefan
Hi,
also ich habe es jetzt mit File::MMagic versucht, aber bekomme immer folgende Fehlermeldung:
x-system/x-error; can't read `Party.jpg': Permission denied.
Ich habe mich daran
my $mm = new File::MMagic;
my $mime = $mm->checktype_filename($tempfile);
und nach cpan.org orientiert, aber bekomme es nicht hin, hmmm?
Markus Trusk.
Hallo,
x-system/x-error; can't read `Party.jpg': Permission denied.
Ich habe mich daran
my $mm = new File::MMagic;
my $mime = $mm->checktype_filename($tempfile);
Na ja, die Meldung ist ja doch recht deutlich. Das öffnen deines $tempfile schlägt fehl. Wo hast du den denn abgelegt und mit welchen Rechten?
Klappt ein normales open FH, "<$tempfile" ohne Probleme oder hast du dich beim Erstellen des Tempfiles irgendwie selbst ausgesperrt? (umask oder ähnliches könnte ja schuld sein.)
Viele Grüße,
Stefan
Hi,
ich habe es auf Windows getestet, was mich schon mal verwundert, wieso ich keine Rechte dafür habe. Ich habe versucht einmal das Filehandle, und einmal die Datei an sich zu benutzen, aber beides klappte irgendwie nicht (Fehlermeldung). Ich werde aber wahrscheinlich meine alte Lösung bevorzugen, da sie jetzt funktioniert.
Markus Trusk.
use Mosche;
my ($x, $y) = imgsize('Party.jpg');
($x || $y) eq undef ? print "Undefiniert" : print "$x x $y\n";
[...oder...]
($x || $y) eq '' ? print "Undefiniert" : print "$x x $y\n";
Finde beides eigentlich unschön.
Folgendes passiert:
($x || $y) liefert true zurück, wenn mindestens eins von $x oder $y ein wahrer Ausdruck ist. Du willst also sowieso ($x && $y) benutzen (davon ausgehend, dass 0-Pixel breite/hohe Bilder Nonsens sind).
Weiterhin habe ich eben schon gesagt, dass der Ausdruck sowieso einen Wahrheitswert (also 0 oder 1) zurückliefert. Schreibe einfach nur
($x && $y) ? print ...
oder prüfe auf (numerische) Gleichheit mit 1 bzw. 0 (ist aber eigentlich unnötig).
use Tschoe qw(Matti);
Hola,
vielen Dank, so klappt es.
Markus Trusk.
Hallo Markus,
Matti hat dir ja schon eine mögliche Lösung gesagt, allerdings bist du meines Wissens hinsichtlich dem "undef" einem kleinen Denkfehler aufgesessen.
my ($x, $y) = imgsize('Party.jpg');
Erste Frage: warum nutzt du hier nicht auch die in Image::Size eingebaute Meldung:
http://search.cpan.org/~rjray/Image-Size-2.992/Size.pm#DIAGNOSTICS
also: my ($x, $y, $msg) = imgsize('Party.jpg');
Weiterhin hat bei Misserfolg die erste Variable ($x) _immer_ den Wert "undef".
($x || $y) eq undef ? print "Undefiniert" : print "$x x $y\n";
Habe ich allerdings eine Grafik, die keine ist, bekomme ich folgende Meldung:
Use of undef without parens is ambiguous....
Schreibe ich '' statt undef bekomme ich: Use of uninitialized value in string line 8.
Logisch. Im Misserfolgsfall ist $x nicht definiert (uninitialized), was eine Warnung auslöst, sobald du sie mit '' vergleichst. "undef" heißt, dass eine Variable zwar existiert, ihr aber kein Inhalt irgendeines Typs zugewiesen wurde. Wenn du eine solche Variable mit dem Leerstring '' vergleichst, unterstellst du ihr die Initialisierung als String. Da die Variable aber "undef" ist, wird die Warnung ausgelöst. Siehe auch:
http://www.perldoc.com/perl5.8.0/pod/perldiag.html#Use-of-uninitialized-value%25s
"undef" ist _kein_ String, sondern eben undef. Ob das so ist, prüfst du am sinnigsten mit der Funktion defined.
P.S Er schreibt mir zwar die Ausgabe "Undefiniert" zusätzlich zur Fehlermeldung hin, aber ich will, dass es ohne Fehlermeldung funktioniert.
Versuche es so:
if( defined $x) {
print "In Ordnung";
}
else {
print "Fehler: $msg";
}
Oder Shorthand, scheint ja modern zu sein, mal sehen, ob ich's richtig hinkriege ;-))
(defined $x) ? print "$x x $y" : print "Fehler beim Lesen: $msg";
Nur zur Ergänzung
Torsten
Hi,
danke für die Info.
Markus Trusk.