Подтвердить что ты не робот

Dojo Инструментарий: как избежать строки HTML?

Пользователь моего приложения HTML 5 может ввести свое имя в форме, и это имя будет отображаться в другом месте. Более конкретно, он станет innerHTML некоторого HTML-элемента.

Проблема в том, что это может быть использовано, если вы введете допустимую HTML-разметку в форме, то есть какую-нибудь HTML-инъекцию, если хотите.

Имя пользователя сохраняется и отображается только на стороне клиента, поэтому в конечном итоге сам пользователь является единственным, кто затронут, но он все еще неаккуратен.

Есть ли способ избежать строки перед тем, как поместить ее в элементы innerHTML в Dojo? Я полагаю, что Dojo в какой-то момент действительно имел такую ​​функцию (dojo.string.escape()), но ее нет в версии 1.7.

Спасибо.

4b9b3361

Ответ 1

dojox.html.entities.encode(myString);

Ответ 2

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

Выход:

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

Ответ 3

Проверьте этот пример 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, "&amp;").
        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>"]
  );
});

Источник: http://dojotoolkit.org/reference-guide/1.7/dojo/replace.html#escaping-substitutions

Ответ 4

Я попытался выяснить, как другие библиотеки реализуют эту функцию, и я украл идею MooTools:

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

Таким образом, согласно MooTools существует либо свойство innerText, либо свойство textContent, которое может выходить из HTML.

Ответ 5

Как и в случае с 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
    );
});