Start · Sprachen · PHP · Referenz · mb_scrub

mb_scrub

Funktion

Ersetzt ungültige Byte-Sequenzen in einem String durch das Unicode-Ersatzzeichen (U+FFFD bzw. das kodierungsspezifische Äquivalent).

seit PHP 7.4.0 Kategorie: string

Signatur

mb_scrub(string $string, ?string $encoding = null): string

Beschreibung

mb_scrub() durchsucht den übergebenen String nach Byte-Sequenzen, die in der angegebenen Zeichenkodierung ungültig sind, und ersetzt diese durch das entsprechende Ersatzzeichen. Bei UTF-8 ist das Ersatzzeichen das Unicode-Replacement-Character U+FFFD (�), bei anderen Kodierungen wird das jeweilige Äquivalent verwendet.

Die Funktion ist besonders nützlich, wenn Eingaben aus externen Quellen (Dateisystem, Datenbankabfragen, HTTP-Requests) verarbeitet werden, da dort fehlerhafte oder absichtlich manipulierte Byte-Sequenzen vorkommen können. Viele Multibyte-Funktionen verhalten sich bei ungültigen Sequenzen undefiniert – ein vorheriger Aufruf von mb_scrub() sorgt für sauber kodierte Daten.

Wird kein Encoding angegeben oder null übergeben, verwendet die Funktion das intern mit mb_internal_encoding() gesetzte Encoding. Typischerweise arbeitet man mit UTF-8, weshalb mb_scrub() häufig als erster Schritt bei der Eingabevalidierung eingesetzt wird.

Im Gegensatz zu mb_convert_encoding() mit identischen Quell- und Zielkodierungen ist mb_scrub() semantisch klarer und explizit für diesen Zweck vorgesehen, ohne Codepage-Konversions-Seiteneffekte.

Parameter

Name Typ Default Beschreibung
$string Pflicht string Der zu bereinigende Eingabe-String, der möglicherweise ungültige Byte-Sequenzen enthält.
$encoding ?string null Die Zeichenkodierung des Strings, z. B. 'UTF-8', 'EUC-JP' oder 'ISO-8859-1'. Bei null wird das interne Encoding (siehe mb_internal_encoding()) verwendet.

Rückgabewert

Typ
string
Beschreibung
Gibt den bereinigten String zurück, bei dem alle ungültigen Byte-Sequenzen durch das Ersatzzeichen der jeweiligen Kodierung ersetzt wurden. Bei UTF-8 ist das das Zeichen U+FFFD.

Beispiele

Ungültige UTF-8-Sequenz bereinigen

<?php
// Ein String mit einer ungültigen UTF-8-Byte-Sequenz (0xFF ist in UTF-8 nie gültig)
$invalid = "Hallo " . "\xFF" . " Welt";

$clean = mb_scrub($invalid, 'UTF-8');

// Ausgabe: Der ungültige Byte wird durch U+FFFD ersetzt
echo bin2hex($clean) . PHP_EOL;
// Das Ersatzzeichen U+FFFD hat in UTF-8 die Byte-Darstellung EF BF BD

echo $clean . PHP_EOL; // Hallo <EFBFBD> Welt (als sichtbares Ersatzzeichen)
48616c6c6f20efbfbd2057656c74 Hallo Welt

Eingaben aus externen Quellen absichern

<?php
/**
 * Verarbeitet einen HTTP-POST-Wert sicher:
 * 1. Byte-Sequenzen bereinigen
 * 2. Weiterverarbeitung mit Multibyte-Funktionen
 */
function sanitizeInput(string $input): string {
    // Zuerst ungültige Bytes entfernen/ersetzen
    $scrubbed = mb_scrub($input, 'UTF-8');

    // Anschließend z. B. Länge begrenzen
    return mb_substr($scrubbed, 0, 255, 'UTF-8');
}

// Simulierter Angriff mit ungültigen Bytes
$userInput = "Normaler Text\x80\x81 Ende";
$safe = sanitizeInput($userInput);

echo mb_strlen($safe, 'UTF-8') . " Zeichen" . PHP_EOL;
echo $safe . PHP_EOL;
18 Zeichen Normaler Text Ende

Vergleich: String vor und nach mb_scrub

<?php
$strings = [
    "Gültiger UTF-8 Text ✓",
    "Ung\xFFültig",
    "\xC3\x28 gebrochene Multibyte-Sequenz",
];

foreach ($strings as $s) {
    $scrubbed = mb_scrub($s, 'UTF-8');
    $valid = ($s === $scrubbed) ? 'gültig' : 'bereinigt';
    echo "[$valid] " . $scrubbed . PHP_EOL;
}
[gültig] Gültiger UTF-8 Text ✓ [bereinigt] Ung�ültig [bereinigt] �( gebrochene Multibyte-Sequenz

// Wichtig · Fallstricke

Sicherheitshinweis: Bestimmte Angriffsmuster (z. B. Overlong Encodings oder ungültige Byte-Sequenzen) können Filter und Validierungsroutinen umgehen. Ein Aufruf von mb_scrub() am Anfang der Eingabeverarbeitung reduziert dieses Risiko erheblich.

Achtung bei binären Daten: mb_scrub() ist nicht für binäre Strings geeignet, da dort beliebige Byte-Werte auftreten können, die als ungültig interpretiert und ersetzt werden. Verwende die Funktion nur auf Strings, die tatsächlich Text in einer bestimmten Kodierung repräsentieren.

Die Funktion ist seit PHP 7.4 verfügbar. In älteren Versionen konnte man mb_convert_encoding($string, 'UTF-8', 'UTF-8') als Workaround verwenden, was jedoch nicht ganz identisch ist.