sheet - ¿Es necesario "escapar" el carácter "<" y ">" para la cadena javascript?
xss javascript tutorial (3)
El problema tiene diferentes respuestas según el lenguaje de marcado que esté utilizando.
Si está utilizando HTML, no debe representarlos con entidades, ya que los elementos de script están marcados como que contienen CDATA.
Si está utilizando XHTML, puede representarlos como CDATA con marcadores CDATA explícitos, o puede representarlos con entidades.
Si está usando XHTML, pero lo sirve como texto / html, entonces necesita escribir algo que cumpla con las reglas de XHTML pero que aún funcione con un analizador de texto / html. Esto generalmente significa usar marcadores CDATA explícitos y comentarlos en JavaScript.
<script type="text/javascript">
// <![CDATA[
…
// ]]>
</script>
Hace un tiempo, escribí un poco acerca de cómo y por qué de esto .
A veces, el lado del servidor generará cadenas para incrustar en el código JavaScript en línea. Por ejemplo, si ASP.NET debe generar "Nombre de usuario". Entonces parece.
<script>
var username = "<%UserName%>";
</script>
Esto no es seguro, porque un usuario puede tener su nombre para ser
</script><script>alert(''bug'')</script></script>
Es la vulnerabilidad de XSS.
Entonces, básicamente, el código debería ser:
<script>
var username = "<% JavascriptEncode(UserName)%>";
</script>
Lo que hace JavascriptEncode es agregar charater "/" antes de "/" y "''" y "". Por lo tanto, el código html de salida es como. Var username = "</script> > </script> ";
El navegador no interpretará " </script> " como final del bloque de script. Por lo tanto, XSS en evitar.
Sin embargo, todavía hay "<" y ">" allí. Se sugiere escapar de estos dos personajes también. En primer lugar, no creo que sea una buena idea cambiar "<" a "& lt;" y ">" a "& gt;" aquí. Y, no estoy seguro de que el cambio de "<" a "/ <" y ">" a "/>" sea reconocible para todos los navegadores. Parece que no es necesario hacer más codificación para "<" y ">".
¿Hay alguna sugerencia sobre esto?
Gracias.
La forma barata y fácil:
<script type="text/javascript">
var username = "<%= Encode(UserName) %>";
</script>
donde el esquema de codificación en Encode
es traducir cada carácter de entrada a la representación /xABCD
asociada compatible con JavaScript.
Otra forma barata y fácil:
<script type="text/javascript">
var username = decodeBase64("<%= EncodeBase64(UserName) %>");
</script>
Si estás tratando solo con ASCII.
Por supuesto, pst
golpeó el clavo en la cabeza con la forma estricta de hacerlo.
No, no debe escapar <
y >
utilizando entidades HTML dentro de <script>
en HTML.
- Use las reglas de escape de cadenas de JavaScript (reemplace
/
con//
y"
con/"
) - y reemplace todas las apariciones de
</
con<//
, para evitar escapar del elemento<script>
.
En XHTML es más complicado.
- Si envía XHTML como XML (la forma en que es incompatible con IE) y no usa el bloqueo CDATA, entonces necesita escapar de las entidades, además de la cadena JavaScript que se escapa.
- Si envía XHTML como XML y usa el bloque CDATA, entonces no escape las entidades, pero reemplace
]]>
con]]]]><![CDATA[>
para evitar que se escape (además de la cadena JavaScript que se escapa). - Si envía XHTML como
text/html
(lo que hace el 99% de las personas), entonces tiene que usar el bloque XML CDATA, el escape de XML CDATA y el escape de HTML a la vez.