2009-09-11 20 views
6

Esto se refiere a this (excellent) answer. Afirma que la mejor solución para escaparse de entrada en PHP es llamar al mb_convert_encoding seguido de html_entities.¿Por qué llamar a mb_convert_encoding para desinfectar el texto?

Pero, ¿por qué llamaría exactamente a mb_convert_encoding con los mismos parámetros desde y hacia (UTF8)?

Extracto de la respuesta original:

Incluso si utiliza htmlspecialchars ($ cadena) fuera de las etiquetas HTML, que siguen siendo vulnerables a múltiples bytes de ataque conjunto de caracteres.

Lo más eficaz que puede ser es utilizar una combinación de mb_convert_encoding y htmlentities de la siguiente manera.

$str = mb_convert_encoding($str, 'UTF-8', 'UTF-8'); 
$str = htmlentities($str, ENT_QUOTES, 'UTF-8'); 

¿Tiene esto algún tipo de beneficio que me falta?

Respuesta

7

No todos los datos binarios son válidos UTF8. Invocar mb_convert_encoding con las mismas codificaciones from/to es una forma sencilla de garantizar que se trata de una cadena codificada correctamente para la codificación dada.

una manera de explotar la omisión de validación UTF8 se describe en la sección 6 (consideraciones de seguridad) en rfc2279:

Otro ejemplo podría ser un analizador sintáctico que prohíbe la secuencia de octeto 2F 2E 2E 2F ("/ ../ "), pero permite la secuencia de octetos ilegales 2F C0 AE 2E 2F.

Esto puede entenderse más fácilmente mediante el examen de la representación binaria:

110xxxxx 10xxxxxx # header bits used by the encoding 
11000000 10101110 # C0 AE 
     00101110 # 2E the '.' character 

En otras palabras: (C0 AE - header-bits) == '.'

A medida que el texto citado señala, C0 AE no es una secuencia UTF8 octeto válido , por lo que mb_convert_encoding lo habría quitado de la cadena (o traducido a '.', o algo más :-).

Cuestiones relacionadas