Как правильно передать объект внутрь script (на стороне фронтенда) при рендеринге темплейта на стороне сервера (express + nunjucks templates). Объект содержит пользовательские данные, то есть может содержать все что угодно. Объект сериализирую в JSON чтобы потом подставить в скрипт и распарсить с помощью JSON.parse. Если выводить напрямую, то включается html экранирование nunjucks и результирующий js получается невалидный. Если отключить экранирование и выводить как есть, то в это чревато проблемами с XSS. Что-то не получилось нагуглить внятного примера под nodejs, хотя знаю что задача актуальная и существуют методы в других шаблонизаторах (var a = {!JSENCODE(var)} к примеру в Visualforce). Нашел выход один, но так сказать через другое место — выводить JSON как обычный экранированный текст в html тег и потом вытягивать его с помощью innerHTML, а дальше парсить. Но может есть способ элегантнее?
ЗЫ: В интеренете в основном предлагают школьные примеры, которые не работают с точки зрения безопасности
<script>
var obj = {{ json | safe }};
</script>
или
<script>
var obj = JSON.parse("{{ json | safe }}");
</script>
Если json это
{userinput: "</script><script>alert('hacked')//", ...};
то это может плохо кончиться
без safe js внутри экранируется но строка становится невалидной для JS