Testen ob Datei wirklich ein Bild ist

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
microkernel
User
Beiträge: 271
Registriert: Mittwoch 10. Juni 2009, 17:27
Wohnort: Frankfurt
Kontaktdaten:

Moin :)
Ich tüftel gerade an einem Programm welche u.a. automatisch Bilder aus dem Web runterlädt (ist alles legal). Allerdings würde ich gerne prüfen, ob die Datei, welche gerade runtergeladen wurde, auch wirklich ein Bild ist. Zur Zeit läuft das Programm so, dass nur Dateien mit einer JPG oder PNG Endung heruntergeladen werden. Mittels mimetypes überprüfe ich, ob die Datei eine Korrekte Endung hat. Allerdings wird anschließend nicht geprüft ob die Datei mit der JPG/PNG Endung auch wirklich ein Bild ist.
Wie kann ich das nun Prüfen? Ich hab mir gedacht, dass ich einfach das Bild mittels PIL öffnen könnte, und schauen könnte, ob PIL mir einen Fehler aufwirft. Aber ist das sicher?
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Unix kennt file.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
BlackJack

@darktrym: Ja aber eben nur Unix. Und unsicherer als tatsächlich zu versuchen die Bilddateien zu dekomprimieren ist es auch, denn ``file`` testet nur eine handvoll Bytes.
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

PIL ist aber weit davon entfernt alle relevanten Formate zu unterstützen, noch dazu crasht das gerne mal wenn ihm etwas nicht koscher vorkommt. Oft genug bei unvollständ. Dateien oder JPEG2000 gesehen.
Aber besser als nur die ersten paar Bytes zu lesen wie es file tut, wenn es auch nicht die performanteste und zuverlässigste Möglichkeit ist. File gibt natürlich auch für andere Plattformen.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Aber man will doch gerade testen ob es ein Bild ist, da ist der zusätzliche Check "kann man es laden" nen Vorteil gegenüber "Hat es nen PNG-Header" weil letzteres auch ein korruptes, halb heruntergeladenes Bild sein kann.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
microkernel
User
Beiträge: 271
Registriert: Mittwoch 10. Juni 2009, 17:27
Wohnort: Frankfurt
Kontaktdaten:

Naja ich hab's jetzt folgendermaßen gelöst (Auszug aus meiner Klasse):

Code: Alles auswählen

    def is_valid(self):
        if self.mimetype not in self.accepted_mimetypes:
            return False
        try:
            image = Image.open(StringIO(self.binary))
            image.verify()
        except IOError:
            return False
        return True
...nur für den Fall, dass ein anderer mal danach sucht.
Benutzeravatar
ocoal
User
Beiträge: 32
Registriert: Mittwoch 20. Juli 2011, 22:44

Hallo auch,

prinzipiell ein gar nicht mal so schlechter Ansatz ... aus Performancegründen würde ich Dir jedoch die Ermittlung des Bildtyps über die Validierung des Dateiheaders empfehlen.

Im Netz findet man diesbezüglich ja wahnsinnig viele Infos. Falls es Dir interessiert: http://www.fastgraph.com/help/image_fil ... rmats.html

Aber warum das Rad neu erfinden, wenn bereits andere sich der Aufgabe gewidmet haben. So findest Du im Python Package Index bereits eine Bilbliothek, die das für dich erledigen kann: ImageLite

-Colin-
Benutzeravatar
ocoal
User
Beiträge: 32
Registriert: Mittwoch 20. Juli 2011, 22:44

Ganz im Gegenteil :) ... ich wusste nicht einmal von diesem Modul und muss sagen, es funktioniert perfekt und unterstützt zudem eine ganze Reihe mehr an Bild-Formaten hinsichtlich der Erkennung.

-Colin-
Antworten