La marque de corruption est un bit unique stocké sur la chaîne elle-même, pas sur la variable qui la contient. Assigner, passer ou partager une chaîne corrompue conserve la marque. La concaténation et l'interpolation de chaînes la propagent également :
= (assignement, y compris list()/déstructuration de tableau) |
. (concaténation) |
.= (assignement de concaténation) |
"{$var}" (interpolation de chaîne, y compris le chemin rapide ROPE) |
De plus, taint comprend un ensemble fixe de fonctions de chaînes : lorsque l'un des arguments de chaîne concernés est corrompu, la chaîne retournée est également marquée comme corrompue. L'appel normal et, sur PHP 8.4+, l'appel rapide sans cadre (frameless) sont tous deux couverts.
| trim(), rtrim(), ltrim() |
| substr(), strstr() |
| str_replace(), str_ireplace() |
| str_pad(), strtolower(), strtoupper(), strval() |
| explode() (chaque élément du tableau résultant) |
| implode()/join() (un séparateur corrompu corrompt également le résultat) |
sprintf(), vsprintf() (seul le spécificateur %s transporte la marque ; sprintf("%d", $t) retourne une chaîne propre) |
| dirname(), basename(), pathinfo() |
Toute fonction que taint ne comprend pas explicitement retourne une
chaîne neuve et non marquée -- y compris les fonctions d'échappement
telles que htmlspecialchars(),
htmlentities() ou
mysqli_real_escape_string(). C'est délibéré : taint
sur-rapporte plutôt que d'essayer de décider si une valeur est
sûre
pour un contexte de sortie particulier. Utiliser
untaint() pour effacer la marque sur des valeurs que
l'on a validées soi-même.