La marca de corrupción es un único bit almacenado en el propio string, no en la variable que lo contiene. Asignar, pasar o compartir de cualquier otra forma un string corrompido conserva la marca. La concatenación y la interpolación de strings también la propagan:
= (asignación, incluyendo list() y la desestructuración de arrays) |
. (concatenación) |
.= (asignación con concatenación) |
"{$var}" (interpolación de strings, incluyendo la vía rápida ROPE) |
Además, taint conoce un conjunto fijo de funciones de strings: cuando alguno de los argumentos de tipo string relevantes está corrompido, el string devuelto también se marca como corrompido. Se cubren tanto la llamada habitual como, en PHP 8.4 y posteriores, la llamada por la vía rápida sin marco de pila.
| trim(), rtrim(), ltrim() |
| substr(), strstr() |
| str_replace(), str_ireplace() |
| str_pad(), strtolower(), strtoupper(), strval() |
| explode() (cada elemento del array resultante) |
| implode()/join() (un separador corrompido también corrompe el resultado) |
sprintf(), vsprintf() (solo el especificador %s transporta la marca; sprintf("%d", $t) devuelve un string limpio) |
| dirname(), basename(), pathinfo() |
Cualquier función que taint no conozca explícitamente devuelve un string
nuevo y sin marcar, incluidas las funciones de escapado como
htmlspecialchars(), htmlentities() o
mysqli_real_escape_string(). Esto es deliberado: taint
informa de más de la cuenta en lugar de intentar decidir si un valor es
seguro
para un contexto de salida concreto. Se debe usar
untaint() para eliminar la marca de los valores que se
hayan validado manualmente.