2012-03-28 4 views
13

Un usuario de mi aplicación HTML 5 puede ingresar su nombre en un formulario, y este nombre se mostrará en otro lugar. Más específicamente, se convertirá en el innerHTML de algún elemento HTML.Dojo Toolkit: ¿cómo escapar de una cadena HTML?

El problema es que esto puede explotarse si se ingresa un marcado HTML válido en el formulario, es decir, algún tipo de inyección HTML, si se quiere.

El nombre del usuario solo se almacena y se muestra en el lado del cliente, por lo que al final el usuario mismo es el único afectado, pero sigue siendo descuidado.

¿Hay alguna manera de escapar de una cadena antes de ponerla en un elemento innerHTML en Dojo? Supongo que Dojo en cierto momento sí tenía esa función (dojo.string.escape()) pero no existe en la versión 1.7.

Gracias.

Respuesta

16
dojox.html.entities.encode(myString); 
+0

Funciona como un encanto y no tengo que reinventar la rueda. ¡Gracias! –

0

Comprobar este ejemplo de dojo.replace:

require(["dojo/_base/lang"], function(lang){ 
    function safeReplace(tmpl, dict){ 
    // convert dict to a function, if needed 
    var fn = lang.isFunction(dict) ? dict : function(_, name){ 
     return lang.getObject(name, false, dict); 
    }; 
    // perform the substitution 
    return lang.replace(tmpl, function(_, name){ 
     if(name.charAt(0) == '!'){ 
     // no escaping 
     return fn(_, name.slice(1)); 
     } 
     // escape 
     return fn(_, name). 
     replace(/&/g, "&"). 
     replace(/</g, "&lt;"). 
     replace(/>/g, "&gt;"). 
     replace(/"/g, "&quot;"); 
    }); 
    } 
    // that is how we use it: 
    var output = safeReplace("<div>{0}</div", 
    ["<script>alert('Let\' break stuff!');</script>"] 
); 
}); 

Fuente: http://dojotoolkit.org/reference-guide/1.7/dojo/replace.html#escaping-substitutions

0

traté de averiguar cómo otras bibliotecas implementan esta función y me robó la idea de lo siguiente de MooTools:

var property = (document.createElement('div').textContent == null) ? 'innerText': 'textContent'; 
elem[property] = "<" + "script" + ">" + "alert('a');" + "</" + "script" + ">"; 

De acuerdo con MooTools, existe la propiedad internalText o textContent, que puede escapar de HTML.

5

Dojo tiene el módulo dojox/html/entities para el escapado de HTML. Desafortunadamente, the official documentation todavía proporciona solo pre-1.7, ejemplo no-AMD.

Aquí hay un ejemplo de cómo utilizar ese módulo con AMD:

var str = "<strong>some text</strong>" 
require(['dojox/html/entities'], function(entities) { 
var escaped = entities.encode(str) 
console.log(escaped) 
}) 

Salida:

&lt;strong&gt;some text&lt;/strong&gt;

0

A partir del Dojo 1.10, la función de escape sigue siendo parte de el módulo de cuerda.

http://dojotoolkit.org/api/?qs=1.10/dojo/string

Así es como se puede usar como un sistema simple plantilla.

require([ 
    'dojo/string' 
], function(
    string 
){ 
    var template = '<h1>${title}</h1>'; 
    var message = {title: 'Hello World!<script>alert("Doing something naughty here...")</script>'} 
    var html = string.substitute(
     template 
     , message 
     , string.escape 
    ); 
}); 
Cuestiones relacionadas