Start · Sprachen · PHP · Referenz · finfo

finfo

Klasse

Ermittelt den MIME-Typ oder andere Informationen einer Datei anhand ihres Inhalts (Magic-Bytes).

seit PHP 5.3.0 Kategorie: io

Signatur

class finfo

Beschreibung

Die Klasse finfo ist eine objektorientierte Schnittstelle zur libmagic-Bibliothek und erlaubt es, Dateien oder Strings anhand ihrer tatsächlichen Byte-Signaturen (Magic Bytes) zu analysieren – unabhängig von Dateiendung oder HTTP-Header. Damit lässt sich der echte MIME-Typ einer Datei zuverlässig bestimmen.

Typische Einsatzgebiete sind der Upload-Validierung (Prüfen, ob eine hochgeladene Datei wirklich ein Bild und kein PHP-Script ist), die Ermittlung von Zeichenkodierungen sowie die Ausgabe detaillierter Datei-Beschreibungen. Die Klasse bietet mit finfo::file() und finfo::buffer() zwei Hauptmethoden für Dateipfade bzw. In-Memory-Daten.

Der Konstruktor nimmt eine oder mehrere FILEINFO_*-Konstanten als Bitmaske entgegen, die das Ausgabeformat steuern. Häufig genutzt werden FILEINFO_MIME_TYPE für den reinen MIME-Typ (z. B. image/png) sowie FILEINFO_MIME für MIME-Typ inkl. Zeichensatz-Parameter.

Die Klasse erfordert die PHP-Erweiterung fileinfo, die seit PHP 5.3 standardmäßig gebündelt ist und seit PHP 8.1 nicht mehr separat aktiviert werden muss.

Parameter

Name Typ Default Beschreibung
$flags int FILEINFO_NONE Eine oder mehrere FILEINFO_*-Konstanten, kombiniert mit dem bitweisen |-Operator. Steuert das Format der zurückgegebenen Informationen (z. B. FILEINFO_MIME_TYPE, FILEINFO_MIME_ENCODING).
$magic_database string|null null Pfad zu einer alternativen Magic-Datenbank-Datei. Bei null oder leerem String wird die standardmäßig installierte libmagic-Datenbank verwendet.

Rückgabewert

Typ

Beispiele

MIME-Typ einer hochgeladenen Datei prüfen

<?php
// Prüfen, ob eine hochgeladene Datei wirklich ein JPEG ist
$finfo = new finfo(FILEINFO_MIME_TYPE);

$uploadedFile = $_FILES['bild']['tmp_name'] ?? '/tmp/beispiel.jpg';

$mimeType = $finfo->file($uploadedFile);

$erlaubteMimeTypes = ['image/jpeg', 'image/png', 'image/gif'];

if (in_array($mimeType, $erlaubteMimeTypes, true)) {
    echo "Erlaubter Dateityp: " . $mimeType;
} else {
    echo "Unerlaubter Dateityp: " . $mimeType;
}
Erlaubter Dateityp: image/jpeg

MIME-Typ eines In-Memory-Strings ermitteln

<?php
// Datei-Inhalt in einen String einlesen und analysieren
$finfo = new finfo(FILEINFO_MIME_TYPE);

// PNG-Magic-Bytes manuell simulieren
$pngHeader = "\x89PNG\r\n\x1a\n";

$mimeType = $finfo->buffer($pngHeader);
echo "Erkannter MIME-Typ: " . $mimeType . PHP_EOL;

// Alternativ: komplette MIME-Angabe inkl. Charset
$finfoVoll = new finfo(FILEINFO_MIME);
$vollstaendig = $finfoVoll->buffer("Hallo Welt");
echo "MIME mit Charset: " . $vollstaendig . PHP_EOL;
Erkannter MIME-Typ: image/png MIME mit Charset: text/plain; charset=us-ascii

Datei-Beschreibung im Klartext abrufen

<?php
// Ausführliche textuelle Beschreibung einer Datei
$finfo = new finfo(FILEINFO_NONE); // Standard: menschenlesbare Beschreibung

$beschreibung = $finfo->file('/usr/bin/php');
echo $beschreibung . PHP_EOL;
// Ausgabe variiert je nach System, z.B.:
// ELF 64-bit LSB pie executable, x86-64, ...
ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, ...

// Wichtig · Fallstricke

Sicherheitshinweis: Verlasse dich bei der Validierung von Datei-Uploads niemals allein auf die Dateiendung oder den vom Client gesendeten Content-Type-Header. Diese lassen sich trivial fälschen. finfo analysiert die tatsächlichen Byte-Signaturen und ist damit deutlich zuverlässiger.

Fallstrick: Auch finfo ist nicht 100 % narrensicher – eine präparierte Datei kann so konstruiert werden, dass sie als harmloser Dateityp erkannt wird, aber trotzdem schadhaften Code enthält (z. B. eingebettetes PHP in einem validen JPEG). Für hochsicherheitskritische Anwendungen empfiehlt sich eine zusätzliche Inhaltsprüfung.

Die prozedurale Entsprechung finfo_open(), finfo_file() und finfo_close() ist ebenfalls verfügbar, die OOP-Variante ist jedoch moderner und bevorzugt.

Auf Windows-Systemen muss in älteren PHP-Versionen (vor PHP 5.3) die php_fileinfo.dll explizit in der php.ini aktiviert werden.