2012-03-28 18 views
13

Użytkownik mojej aplikacji HTML 5 może wpisać swoje nazwisko w formularzu, a ta nazwa będzie wyświetlana w innym miejscu. Dokładniej, będzie to innerHTML jakiegoś elementu HTML.Dojo Toolkit: jak uciec z ciągu HTML?

Problem polega na tym, że można to wykorzystać, jeśli wprowadzimy poprawny znacznik HTML w formie, np. Jakiś wstrzyknięty kod HTML, jeśli to zrobisz.

Nazwa użytkownika jest przechowywana i wyświetlana tylko po stronie klienta, więc ostatecznie sam użytkownik jest jedyną osobą, której dotyczy problem, ale nadal jest zaniedbany.

Czy istnieje sposób na ucieczkę z łańcucha przed umieszczeniem go w elemencie innerHTML w aplikacji Dojo? Przypuszczam, że Dojo w pewnym momencie rzeczywiście miało taką funkcję (dojo.string.escape()), ale nie istnieje w wersji 1.7.

Dzięki.

Odpowiedz

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

Działa jak urok i nie muszę wymyślać koła. Dzięki! –

0

Sprawdź ten przykład 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>"] 
); 
}); 

Źródło: http://dojotoolkit.org/reference-guide/1.7/dojo/replace.html#escaping-substitutions

0

Próbowałem dowiedzieć się, jak inne biblioteki realizacji tej funkcji i ukradł pomysł z następujących opcji z MooTools:

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

Tak więc według MooTools istnieje właściwość innerText lub textContent, która może uciec z HTML.

5

Dojo ma moduł dojox/html/entities do usuwania kodu HTML. Niestety, the official documentation nadal dostarcza tylko przykład pre-1.7, nie AMD.

Oto przykład jak używać tego modułu z AMD:

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

wyjściowa:

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

0

Jak Dojo 1.10, funkcja ucieczka jest nadal częścią moduł ciągów.

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

Oto jak można wykorzystać go jako prosty system szablonów.

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