Signatur
Beschreibung
is_tainted() gehört zum Taint-Tracking-System, das in PHP 8.4 eingeführt wurde. Es erlaubt zu prüfen, ob ein String intern als tainted – also als potenziell unsichere Benutzereingabe – markiert ist. Tainted Strings stammen typischerweise aus externen Quellen wie $_GET, $_POST, $_COOKIE, $_FILES oder anderen Superglobalen.
Das Taint-Tracking hilft dabei, unsanitisierte Eingaben im Datenfluss eines Programms zu verfolgen und sicherheitsrelevante Stellen (z. B. SQL-Abfragen, HTML-Ausgaben) zu schützen. Sobald ein tainted String durch eine geeignete Säuberungsfunktion (z. B. htmlspecialchars()) bereinigt wird, verliert er seine Taint-Markierung und is_tainted() gibt false zurück.
is_tainted() kann zum expliziten Absichern kritischer Codestellen eingesetzt werden, indem vor der Weiterverarbeitung geprüft wird, ob ein Wert noch unsicher ist. Das ermöglicht frühzeitiges Erkennen von Sicherheitslücken bereits zur Laufzeit.
Beachte, dass dieses Feature nur verfügbar ist, wenn PHP mit Taint-Unterstützung kompiliert wurde (experimentelles Feature in 8.4). Es ersetzt keine vollständige Eingabevalidierung, sondern ergänzt sie.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $value Pflicht | string | Der zu prüfende String. Gibt true zurück, wenn dieser String intern als unsicher (tainted) markiert ist. |
Rückgabewert
true zurück, wenn der übergebene String als tainted markiert ist, andernfalls false.Beispiele
Benutzereingabe auf Taint prüfen
<?php
// Simuliert eine Benutzereingabe aus $_GET
$input = $_GET['name'] ?? '';
if (is_tainted($input)) {
echo "Warnung: Der Wert ist unsicher und wurde noch nicht bereinigt.\n";
} else {
echo "Der Wert gilt als sicher.\n";
}
// Nach Bereinigung mit htmlspecialchars()
$clean = htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
if (is_tainted($clean)) {
echo "Immer noch unsicher.\n";
} else {
echo "Wert wurde bereinigt und ist nicht mehr tainted.\n";
}
Absichern vor SQL-Abfrage
<?php
function safe_query(PDO $pdo, string $userInput): array {
if (is_tainted($userInput)) {
throw new RuntimeException(
'Unsanitisierte Eingabe darf nicht direkt in Abfragen verwendet werden!'
);
}
$stmt = $pdo->prepare('SELECT * FROM users WHERE name = :name');
$stmt->execute([':name' => $userInput]);
return $stmt->fetchAll();
}
// Direkter Aufruf mit tainted Input würde eine Exception werfen:
// safe_query($pdo, $_POST['username']);
// Korrekte Verwendung: Prepared Statements machen den Taint obsolet,
// aber die explizite Prüfung dient als zusätzliche Sicherheitsschicht.
echo "Funktion definiert und bereit.\n";
// Wichtig · Fallstricke
Experimentelles Feature: Das Taint-Tracking in PHP 8.4 ist als experimentell eingestuft. Die Verfügbarkeit von is_tainted() hängt davon ab, ob PHP mit der entsprechenden Compile-Zeit-Option gebaut wurde. In Standard-PHP-Distributionen kann die Funktion fehlen.
Kein Ersatz für Validierung: is_tainted() prüft lediglich, ob ein Wert als unsicher markiert ist. Es ersetzt nicht die eigentliche Eingabevalidierung und -bereinigung. Auch nicht-tainted Strings können gefährliche Inhalte enthalten, wenn sie aus nicht-überwachten Quellen stammen.
Taint-Propagation: Die Taint-Markierung wird durch String-Operationen wie Konkatenation weitergegeben. Sobald ein tainted String mit einem anderen String verknüpft wird, gilt das Ergebnis ebenfalls als tainted.