Start · Sprachen · PHP · Referenz · finfo_buffer

finfo_buffer

Funktion

Analysiert einen String-Puffer mit der <code>fileinfo</code>-Erweiterung und gibt Informationen zum Inhalt zurück (z. B. MIME-Typ).

seit PHP 5.3.0 Kategorie: io

Signatur

finfo_buffer(finfo $finfo, string $string, int $flags = FILEINFO_NONE, ?resource $context = null): string|false

Beschreibung

finfo_buffer() ermöglicht es, Metainformationen (typischerweise den MIME-Typ oder die MIME-Kodierung) über den Inhalt eines Strings zu ermitteln, ohne dass die Daten zuvor in einer Datei gespeichert werden müssen. Dies ist besonders nützlich, wenn Daten aus einem Upload-Stream, einer Datenbank oder einer API-Antwort direkt geprüft werden sollen.

Die Funktion gehört zur prozeduralen API der fileinfo-Erweiterung und arbeitet mit einem zuvor per finfo_open() erzeugten finfo-Ressourcen-Objekt zusammen. Das Verhalten wird über $flags gesteuert – beispielsweise gibt FILEINFO_MIME_TYPE nur den MIME-Typ zurück, während FILEINFO_MIME Typ und Zeichenkodierung kombiniert.

Im Gegensatz zu finfo_file(), das eine Datei auf dem Dateisystem liest, arbeitet finfo_buffer() ausschließlich mit im Speicher befindlichen Daten. Damit eignet es sich hervorragend zur Validierung von Datei-Uploads direkt nach dem Lesen der temporären Datei oder bei der Verarbeitung von Base64-dekodierten Binärdaten.

Schlägt die Analyse fehl, gibt die Funktion false zurück. Ein häufiger Grund ist ein leerer String oder ein nicht initialisiertes finfo-Objekt.

Parameter

Name Typ Default Beschreibung
$finfo Pflicht finfo Eine finfo-Instanz, die zuvor mit finfo_open() erzeugt wurde.
$string Pflicht string Der zu analysierende String-Puffer (Binär- oder Textdaten), dessen Typ ermittelt werden soll.
$flags int FILEINFO_NONE Kombination aus FILEINFO_*-Konstanten, die das Ausgabeformat steuern. Häufig genutzt: FILEINFO_MIME_TYPE, FILEINFO_MIME, FILEINFO_EXTENSION.
$context resource|null null Ein optionaler Stream-Kontext (von stream_context_create()). In den meisten Anwendungsfällen wird null übergeben.

Rückgabewert

Typ
string|false
Beschreibung
Gibt einen String mit den ermittelten Informationen (z. B. image/png) zurück, oder false bei einem Fehler.

Beispiele

MIME-Typ eines hochgeladenen Bildes aus dem Speicher prüfen

<?php
// Datei-Upload: Inhalt der temporären Datei in einen String lesen
$uploadedData = file_get_contents($_FILES['userfile']['tmp_name']);

$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimeType = finfo_buffer($finfo, $uploadedData);
finfo_close($finfo);

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

if (in_array($mimeType, $allowedTypes, true)) {
    echo "Erlaubter Typ: " . $mimeType;
} else {
    echo "Nicht erlaubter Dateityp: " . $mimeType;
}
Erlaubter Typ: image/jpeg

Base64-dekodierte Daten auf MIME-Typ prüfen

<?php
// Beispiel: Kleines 1x1 Pixel transparentes PNG als Base64
$base64 = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==';
$binaryData = base64_decode($base64);

$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimeType = finfo_buffer($finfo, $binaryData);
finfo_close($finfo);

echo "Erkannter MIME-Typ: " . $mimeType;
Erkannter MIME-Typ: image/png

MIME-Typ und Kodierung kombiniert ausgeben

<?php
$textData = "Hallo Welt! Dies ist ein einfacher Textstring.";

$finfo = finfo_open(FILEINFO_MIME);
$result = finfo_buffer($finfo, $textData);
finfo_close($finfo);

echo $result;
text/plain; charset=us-ascii

// Wichtig · Fallstricke

Sicherheitshinweis: Verlasse dich bei der Validierung von Datei-Uploads niemals ausschließlich auf die Dateiendung oder den vom Client gemeldeten MIME-Typ ($_FILES['userfile']['type']). Diese Angaben können leicht gefälscht werden. finfo_buffer() analysiert hingegen die tatsächlichen Magic Bytes des Inhalts und ist damit deutlich zuverlässiger.

Beachte, dass finfo_buffer() nur so zuverlässig arbeitet wie die zugrunde liegende libmagic-Datenbank. Sehr kurze oder unbekannte Binärformate können falsch erkannt oder als application/octet-stream zurückgegeben werden.

Die fileinfo-Erweiterung ist seit PHP 5.3.0 standardmäßig gebündelt, muss aber ggf. in älteren Umgebungen explizit aktiviert werden (extension=fileinfo in der php.ini).