Dojo Toolkit: как избежать строки HTML? - PullRequest
13 голосов
/ 28 марта 2012

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

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

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

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

Спасибо.

Ответы [ 5 ]

16 голосов
/ 28 марта 2012
dojox.html.entities.encode(myString);
6 голосов
/ 22 июля 2014

В 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;

0 голосов
/ 18 сентября 2014

Начиная с 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
    );
});
0 голосов
/ 28 марта 2012

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

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

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

0 голосов
/ 28 марта 2012

Проверьте этот пример 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

...