Ответ 1
dojox.html.entities.encode(myString);
Пользователь моего приложения HTML 5 может ввести свое имя в форме, и это имя будет отображаться в другом месте. Более конкретно, он станет innerHTML
некоторого HTML-элемента.
Проблема в том, что это может быть использовано, если вы введете допустимую HTML-разметку в форме, то есть какую-нибудь HTML-инъекцию, если хотите.
Имя пользователя сохраняется и отображается только на стороне клиента, поэтому в конечном итоге сам пользователь является единственным, кто затронут, но он все еще неаккуратен.
Есть ли способ избежать строки перед тем, как поместить ее в элементы innerHTML
в Dojo? Я полагаю, что Dojo в какой-то момент действительно имел такую функцию (dojo.string.escape()
), но ее нет в версии 1.7.
Спасибо.
dojox.html.entities.encode(myString);
Dojo имеет модуль dojox/html/entities
для экранирования HTML. К сожалению, официальная документация по-прежнему содержит только пример до 1.7, не-AMD.
Вот пример использования этого модуля с AMD:
var str = "<strong>some text</strong>"
require(['dojox/html/entities'], function(entities) {
var escaped = entities.encode(str)
console.log(escaped)
})
Выход:
<strong>some text</strong>
Проверьте этот пример 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, "<").
replace(/>/g, ">").
replace(/"/g, """);
});
}
// that is how we use it:
var output = safeReplace("<div>{0}</div",
["<script>alert('Let\' break stuff!');</script>"]
);
});
Источник: http://dojotoolkit.org/reference-guide/1.7/dojo/replace.html#escaping-substitutions
Я попытался выяснить, как другие библиотеки реализуют эту функцию, и я украл идею MooTools:
var property = (document.createElement('div').textContent == null) ? 'innerText': 'textContent';
elem[property] = "<" + "script" + ">" + "alert('a');" + "</" + "script" + ">";
Таким образом, согласно MooTools существует либо свойство innerText, либо свойство textContent, которое может выходить из HTML.
Как и в случае с Dojo 1.10, функция escape все еще является частью строкового модуля.
http://dojotoolkit.org/api/?qs=1.10/dojo/string
Здесь вы можете использовать его как простую систему шаблонов.
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
);
});