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.