What's new? | Help | Directory | Sign in
Google
             
Search
for
Updated Sep 11, 2008 by pilgrim
EsArticleXSSInEventHandlers  

COMO filtrar entradas de usuario en manejadores de evento JavaScript

English日本語Français
InicioSeguridad Web

En adición a todos los medios para inyectar códigos maliciosos en etiquetas <script>, esta es una complicación adicional que surge por los manejadores de eventos de JavaScript. (By "event handlers," I mean JavaScript-valued tag attributes such as onclick, onload, or onerror.) The values of such attributes are HTML-unescaped before they are passed to the JS interpreter.

Ejemplo

En principio, consideremos el trozo de plantilla:

  <form:button ...
               onclick='IraUrl("%(Urldestino)s");'>

Supongamos que un atacante inyecta el valor:

  foo&quot;);evil_script(&quot;

para Urldestino. Fijémonos en esta cadena y nos damos cuenta que no necesitamos ningun escape de JS, porque esa cadena no contiene más carácteres JS sin escapar que comillas o metacaracteres HTML. Sin embargo, el escenario anterior deviene en el siguiente documento para ser evaluado por el navegador:

  <form:button ...
               onclick='IraUrl("foo&quot;);
                        evil_script(&quot;");'>

¿Porqué? Porque el navegador desescapa el valor del atributo onclick automáticamente. La expresión que es evaluada actualmente por el interprete JS del navegador es esta:

  IraUrl("foo");evil_script("");

Entonces el interprete terminará ejecutando evil_script.

Como evitarlo

Si deseas insertar literales dentro del contexto del atributo que es interpretado como una expresión JavaScript (como son onclick, onload, onerror, o una más de estos),

  1. asegurate que la literal encadejada es escapada por JavaScript usando una función que satisfaga los criterios definidos para el contexto JavaScript
  2. Asegurate de que la literal encadenada está encerrada en comillas simples
  3. Escapa por HTML el valor de atributo suministrado
  4. Asegurate de que elvalor del atributo suministrado está encerrado en comillas dobles

(El orden de la operación es importante aquí! haz tus escapes en este orden exacto!)

Como un consejo de seguridad adicional, tu función de escape JS también escapa los cinco metacaracteres HTML &, <, >, ", y ' dentro de sus escapes de carácter JavaScript Unicode correspondientes.

Razonando

El paso de escape adicional HTML nos asegura que esa expresión JS pasa al interprete JS como es debido, y un atacante no puede "fisgonear" en carácteres HTML codificados.

Usar estilos distintos de comillas para literales JS y los atributos proporciona una medida segura contra un tipo de comilla accidentalmente termine la otra.

El uso de una función de escape JS que escape metacaracteres HTML en cadenas de escape JS numéricas proporciona una medida de seguridad adicional en casos donde un programador olvide usar ambos escapes en secuencia y solo utilice el escape JS. Nota que para que esta medida sea efectiva, es importante usar el escape numérico para caracteres de comilla (p.e. \x22 en lugar de \"), pues el parseador HTML no considera la diagonal invertida un carácter de escape, y sin embargo una "\" no-HTML escapada podría actualmente "cerar" el atributo.

Para leer más


Sign in to add a comment