PHP: si el conjunto de caracteres no coincide (htmlentities UTF-8) visto por el cliente como ISO-8859-1 (o viceversa)

11

Pregunta corta:

Pregunta: ¿Podría surgir alguna vulnerabilidad de seguridad si un servidor ejecuta htmlentities como UTF-8 pero el cliente ve los resultados como ISO-8859-1?

Supuesto: no existen vulnerabilidades cuando se utiliza un conjunto de caracteres coherente

Pregunta detallada:

Pregunta: ¿Podrían surgir vulnerabilidades de seguridad si el servidor htmlentities una cadena ISO-8859-1 como UTF-8? (¿Y el cliente interpreta el resultado como ISO-8859-1?)

(por ejemplo, $results = htmlentities($iso_8859_1_string, ENT_QUOTES, "UTF-8")

Suponiendo que todo está codificado de tal manera que no surjan vulnerabilidades cuando solo se utiliza la codificación de un solo conjunto de caracteres. (Ignorando si $ resultados = cadena vacía).

Quizás si $iso_8859_1_string pudiera contener cualquier valor, los resultados se tratarán como UTF-8 no válido (y devolver ""), o como UTF-8 válido. Para UTF-8 válido, las secuencias de UTF-8 se escaparían como se esperaba, pero ¿cómo se verían los resultados en el cliente interpretando el resultado como ISO-8859-1? Los caracteres hacen que el rango de 0 a 127 se escape como se esperaba (igual que "US-ASCII"), algunos caracteres se resolverían en entidades html y podrían mostrarse como se esperaba. ¿Hay caracteres UTF-8 válidos en el rango superior de 128+ que no se resuelven en las entidades html? ¿El cliente solo vería un montón de texto / símbolos confusos / no utilizados pero no caracteres que harían que el navegador web ejecute código o cambie a un contexto de ejecución de código? (por ejemplo, no hay caracteres de etiqueta como los símbolos '<' '>')? (Suponiendo que los $ resultados se pongan en un "contexto de contenido", y no en un "valor de atributo" o un cuerpo de "script").

¿Es esta línea recta de pensamiento?

Nota : Creo que ya resolví el caso y viceversa (es decir, si el servidor contiene una cadena UTF-8 como ISO-8859-1 y la el cliente interpreta el resultado como UTF-8)

(por ejemplo, htmlentities($utf8_string, ENT_QUOTES, "ISO-8859-1") )

Respuesta: Mi suposición no es una vulnerabilidad de seguridad en el cliente (para htmlentities como ISO - > el cliente lee como UTF-8) porque:

  • En ISO-8859-1, caracteres en el rango:

    • 0-127 (US-ASCII): están codificados exactamente de la misma manera en UTF-8,
    • 160 - > 255 en ISO-8859-1 se codificarían como entidades HTML,
    • dejando solo el rango de 128-159 caracteres ..., pero de acuerdo con la especificación UTF-8 de Wikipedia, enlace , todos los bytes UTF-8 que están en el rango 128+ forman parte de "secuencias de múltiples bytes" que comprenden un "byte principal" que siempre es 192 o superior, y "bytes de continuación" en el rango 128+ . Por lo tanto, htmlentities($utf8_string, ENT_QUOTES, "ISO-8859-1") no pudo generar los "bytes iniciales" necesarios para que UTF-8 genere secuencias válidas de múltiples bytes. Entonces, ¿cualquier carácter en este rango aparecería en UTF-8 como un? (es decir, un carácter no válido) debido a que no aparece ningún "byte inicial".

Creo que esto resuelve mi pregunta para la otra dirección.

Situación real: un servidor PHP 5.3.x con backports de seguridad utiliza ISO-8859-1 como la codificación predeterminada. A partir de PHP 5.4, UTF-8 es la codificación predeterminada. enlace . Estoy deseando determinar si el código funciona correctamente en un entorno todo de UTF-8 o todo ISO-8859-1, y asegurarme de que no haya agujeros de seguridad automáticos causados por errores de codificación / falta de coincidencia.

Siento que puedo estar seguro de que solo la usabilidad se ve afectada, pero no la seguridad en estos casos específicos.

    
pregunta user2533809 28.02.2014 - 09:59
fuente

2 respuestas

4

Que yo sepa, no hay ningún problema de seguridad.

Los caracteres "peligrosos" en HTML (menos de, mayor que, y, comillas simples, comillas dobles) tienen valores de bytes idénticos en UTF-8 e ISO-8859-1 (y prácticamente en todas las demás codificaciones) Es probable que se produzcan, con las excepciones de UTF-16, UTF-32 y EBCDIC). Como resultado, escapar de ellos en una codificación también los escapará en la otra codificación.

La razón por la que esto es cierto es que la gran mayoría de las codificaciones de caracteres, incluidos UTF-8 e ISO-8859-1, son "ASCII más caracteres adicionales", y la estructura de un documento HTML solo usa caracteres en la parte ASCII de la codificación.

    
respondido por el Mark 08.06.2014 - 23:18
fuente
-2

mientras yo sepa, mientras sus scripts PHP (es decir, formularios) utilicen el filtro para htmlspecialchars () y elimine elementos como símbolos extraños y barras invertidas, no habría ningún riesgo de seguridad, al menos desde mi perspectiva. > Sin embargo,

obligar a un conjunto de caracteres a ser usado por el cliente es una opción para nosotros, los paranoicos, junto con las cosas básicas que acabo de nombrar.

    
respondido por el Lighty 23.04.2014 - 13:49
fuente

Lea otras preguntas en las etiquetas