Signatur
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
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)
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;
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;
}
// 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.