Можно ли было бы добавить опцию, чтобы вообще не экранировать html?
Я не тестировал его, но согласно справочной странице:
All variables are HTML escaped by default. If you want to return unescaped HTML, use the triple mustache: {{{name}}}.
Если это не сработает, вы можете использовать функцию, которая просто возвращает ввод без экранирования.
Да, это текущее поведение, но мой вариант использования для этого имеет очень надежный ввод и множество специальных символов.
Я имел в виду эту часть:
If you want to return unescaped HTML, use the triple mustache: {{{name}}}.
Поэтому, если вы не хотите, чтобы ваши переменные были экранированы, вы должны использовать тройные усы вместо двойных.
Изменить: я протестировал это, и это правильно реализовано в этой реализации.
Ага, интересно, есть ли полезный ярлык для изменения поведения по умолчанию.
Некоторые реализации ранее поддерживали инвертированную директиву escape (mustache.php v1.x, ruby v0.8ish). По сути, это поменяло местами значения {{ foo }}
и {{{ foo }}}
. Он пригодится для использования не в формате html, например для файлов ini, поскольку в этом случае экранирование сущностей html не имеет смысла и избавляет вас от лишних усов.
Однако Mustache.php v2.x не поддерживает эту прагму. Вместо этого мы выбрали настраиваемую опцию «escape», позволяющую пользователям передавать альтернативный обратный вызов escape. Передача function($text) { return $text; }
превращает побег в бездействие.
Хм, это точно подходит для моего варианта использования. Возможно ли это сделать в mustache.js, и если да, то где бы вы передали эту функцию?
Правильно, придерживаться руководящих принципов OWASP - это нормально, но в некоторых случаях постоянный побег бесполезен. Есть ли какое-либо расчетное время прибытия для завершения этой проблемы?
Не было бы проще просто поменять местами {{{
и {{
в синтаксическом анализаторе в вашей установке?
На данный момент просто бегаю:
template.replace(/\{\{([^\}]*)\}\}/g, '{{{$1}}}');
на всех моих шаблонах перед его выполнением, что действительно работает. Было бы хорошо иметь более встроенную систему. Мне очень нравится предложение @bobthecow , поскольку оно позволит вам избежать других вещей, если вам нужно. например, если у вас был формат, подобный JSON, а не XML, например, вы могли бы избежать кавычек / запятых / двоеточий и т. д.
@janl, что, если я хочу отобразить один и тот же шаблон в двух сценариях: первый с экранированием, второй без экранирования?
@bobthecow Мы могли бы легко
Mustache.escapeHtml = function (text) { return text; }
Было бы это полезно? Конечно, вам нужно быть осторожным, чтобы сбросить значение функции, если вы хотите, чтобы экранирование работало должным образом при последующих вызовах, и вы не сможете принять решение о побеге с тройным усом.
: +1: Я копаю. Насколько я могу судить, основной вариант использования - это полное отключение экранирования, потому что это не HTML-документ. Я не вижу особого смысла в замене escape / noescape (поэтому я даже не реализовал ее в Mustache.php v2).
Да, это определенно соответствовало бы моему варианту использования, и я могу представить, что некоторые другие люди будут использовать это, как скажем:
Mustache.escapeHtml = function (text) { return text.replace(/\"/g, '\\"'; }
чтобы избежать строк. Или они могут реализовать функции белого списка. Короче говоря, это исправит все возможные варианты использования.
Я не тестировал его, но согласно справочной странице:
All variables are HTML escaped by default. If you want to return unescaped HTML, use the triple mustache: {{{name}}}.
Если это не сработает, вы можете использовать функцию, которая просто возвращает ввод без экранирования.
Благодаря тонну!! Это работает.
Самый полезный комментарий
Я не тестировал его, но согласно справочной странице:
All variables are HTML escaped by default. If you want to return unescaped HTML, use the triple mustache: {{{name}}}.
Если это не сработает, вы можете использовать функцию, которая просто возвращает ввод без экранирования.