2012-03-28 10 views
13

Un utente della mia applicazione HTML 5 può inserire il suo nome in un modulo e questo nome verrà visualizzato altrove. Più specificamente, diventerà lo innerHTML di alcuni elementi HTML.Dojo Toolkit: come sfuggire a una stringa HTML?

Il problema è che questo può essere sfruttato se si immette un codice HTML valido nel modulo, ad esempio una sorta di iniezione HTML, se lo si desidera.

Il nome dell'utente viene memorizzato e visualizzato solo sul lato client, quindi alla fine l'utente stesso è l'unico a essere interessato, ma è ancora sciatto.

C'è un modo per sfuggire a una stringa prima di inserirla in elementi innerHTML in Dojo? Immagino che Dojo a un certo punto avesse effettivamente una tale funzione() ma non esiste nella versione 1.7.

Grazie.

risposta

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

Funziona come un incantesimo e non devo reinventare la ruota. Grazie! –

0

Controllare questo esempio di 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>"] 
); 
}); 

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

0

ho cercato di scoprire come altre biblioteche implementare questa funzione e mi ha donato l'idea di quanto segue da MooTools:

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

Quindi, secondo MooTools, c'è la proprietà innerText o textContent che può sfuggire all'HTML.

5

Dojo ha il modulo dojox/html/entities per l'escape HTML. Sfortunatamente, the official documentation fornisce ancora solo l'esempio precedente alla 1.7, non AMD.

Ecco un esempio come usare quel modulo con AMD:

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

uscita:

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

0

A partire dal Dojo 1.10, la funzione di fuga è ancora parte della il modulo stringa.

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

Ecco come è possibile utilizzarlo come un semplice sistema di template.

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 
    ); 
}); 
Problemi correlati