dmnBrest
@dmnBrest
Salesforce for money. Python, Go, Ruby for soul.

Как передать значение в javascript в шаблоне который рендерится на стороне сервера?

Как правильно передать объект внутрь 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
  • Вопрос задан
  • 431 просмотр
Пригласить эксперта
Ответы на вопрос 1
@kulaeff
Front-end developer
Можно попробовать через data аттрибуты у какого-нибудь html-элемента, например, у body.
Допустим, json такой:
{
    id: 1,
    title: 'blablabla'
}


тогда будет

<body data-json="{id:1,title:'blablabla'}">

и дальше уже парсите его.
Либо можно разбить на несколько data аттрибутов:

<body data-id="1" data-title="blablabla">
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
30 нояб. 2024, в 22:41
500 руб./за проект
30 нояб. 2024, в 20:49
2000 руб./за проект
30 нояб. 2024, в 20:18
5000 руб./за проект