¿cómo pueden incluirse valores no confiables en una página html como constantes de cadena de javascript? Aunque el caso que estoy preguntando utiliza JSF y Rails, creo que este es un problema general independiente del marco del lado del servidor.
en-atributos
Obviamente, no es suficiente escapar \ '"en los atributos on:
onclick='alert("[variable]")'
variable: hello, world"); alert("XSS
result: alert("hello, world"); alert("XSS")
En Firefox esto mostrará un "Hola, mundo" y un diálogo de alerta "XSS". Como la variable no contiene un ", la función Rails escape_javascript no es suficiente en este contexto. Appyling html El escape parece ser seguro, ya que solo se muestra el cuadro de diálogo original en este caso:
result: onlick='alert("hello, world"); alert("XSS")'
etiquetas de script
En < script > Las etiquetas, sin embargo, se aplican diferentes reglas en Firefox:
<script type="text/javascript">
alert("hello, world"); alert("XSS");
</script>
Esto muestra solo un cuadro de diálogo; pero las citas se muestran en su forma de escape. Hay dos conclusiones: 1) & quot; no se analiza como un signo de cita de JavaScript (bueno), segundo) tampoco se analiza de acuerdo con las reglas HTML (incorrecto). Para que cualquier intento de html escapar de la constante crea datos rotos.
Saltar html que se escapa en las etiquetas de script, sin embargo, no es una opción:
<script type="text/javascript">alert("[variable]");</script>
variable: hello, world</script><script>alert("XSS
result: <script type="text/javascript">
alert("hello, world</script><script>alert("XSS");</script>
La primera etiqueta de secuencia de comandos crea un error de sintaxis debido a la falta ". Pero en Firefox se ejecuta la segunda etiqueta de secuencia de comandos inyectada.
tl, dr
¿Existe una forma segura de escribir valores no confiables en constantes de JavaScript? Esto parece ser un desastre total, y actualmente me estoy inclinando hacia el uso de elementos html (con style="dispaly: none"). Una llamada XMLHttpRequest usando JSON sería otra opción. Pero ambos enfoques se sienten como trampa.