Я использую серверную часть Nodejs для рендеринга на стороне сервера с использованием рулей. После прочтения doc
массива объектов из руля, который содержит ключи «content» и «from». Однако, когда я пытаюсь использовать #each
цикл в массиве объектов, появляется ошибка «Handlebars: Access было отказано в разрешении свойства« from », поскольку оно не является« собственным свойством »его родителя» ».
Я попытался console.log () данные, которые я выбрал в массиве doc, и все выглядит нормально.
С какой-то точки зрения это запрос mongoose,
я добавил объект doc в качестве ключа в аргументы res.render.
Confession.find()
.sort({date: -1})
.then(function(doc){
for(var i=0; i < doc.length; i++){
//Check whether sender is anonymous
if (doc[i].from === "" || doc[i].from == null){
doc[i].from = "Anonymous";
}
//Add an extra JSON Field for formatted date
doc[i].formattedDate = formatTime(doc[i].date);
}
res.render('index', {title: 'Confession Box', success:req.session.success, errors: req.session.errors, confession: doc});
req.session.errors = null;
req.session.success = null;
});
Это часть файла .hbs, которую я пытаюсь перебрать:
{{#each confession}}
<div class="uk-card uk-card-default uk-card-body uk-margin uk-align-center uk-width-1-2@m" >
<div class="uk-text-bold">Message: </div>
<div>{{this.content}}</div>
<div>From: {{this.from}}</div>
<div>Posted: {{this.formattedDate}}</div>
</div>
{{/each}}
javascript
node.js
mongodb
express
handlebars.js
Ли Бун Конг
источник
источник
При использовании mongoose эту проблему можно решить с помощью .lean (), чтобы получить объект json (вместо mongoose):
источник
Сегодня у меня такое же предупреждение от руля, и вид пуст. Вот как я это исправил:
файл users.hbs
Создание целого нового объекта с именами
context
со своими собственными свойствами, а затем передача его в функцию рендера, решит проблему ...нота:
Когда мы не создаем новый объект, легко случайно раскрыть конфиденциальную информацию или информацию, которая может поставить под угрозу безопасность проекта, сопоставление данных, возвращаемых из базы данных, и передачу только того, что необходимо для представления, может быть хорошей практикой ...
источник
«Да, это сработало. Почему это происходит? Я сейчас использую экспресс-рули (3.1.0), которые я установил в качестве механизма рендеринга в своем экспресс-приложении». - Ли Бун Конг 12 января в 14:13
«В прошлом Handlebars позволяли вам получать доступ к методам и свойствам прототипа объекта ввода из шаблона ... Из-за этого поведения возникли многочисленные проблемы безопасности ... В handlebars@^4.6.0. Доступ к прототипу объекта имеет полностью отключен. Теперь, если вы используете пользовательские классы в качестве входных данных для Handlebars, ваш код больше не будет работать ... Этот пакет автоматически добавляет параметры времени выполнения к каждому вызову шаблона, отключая ограничения безопасности ... Если ваши пользователи пишут шаблоны и вы выполняете их на своем сервере, вы не должны использовать этот пакет, а вместо этого найти другие способы решения проблемы ...Я предлагаю вам преобразовать ваши экземпляры классов в обычные объекты JavaScript, прежде чем передавать их в функцию шаблона. Каждое свойство или функция, к которой вы обращаетесь, должно быть "собственным свойством" своего родителя. "- README
Более подробная информация здесь: https://www.npmjs.com/package/@handlebars/allow-prototype-access
БОЛЬШЕ БОЛЬШЕ БЕЗОПАСНОГО МЕТОДА
Перед передачей объекта, возвращенного вызовом AJAX, в шаблон Handlebars, сопоставьте его с новым объектом с каждым свойством или функцией, к которым вам нужно получить доступ в вашем
.hbs
файле. Ниже вы можете увидеть новый объект, созданный перед передачей его в шаблон Handlebars.Ваш запрос мангуста
Поправьте меня, если я ошибаюсь, но я думаю, что это может сработать для вашего запроса ...
источник
попробуйте npm установить руль версии 4.5.3
npm установить руль@4.5.3
У меня сработало
источник
Начиная с версии 4.6.0, Handlebars по умолчанию запрещает доступ к свойствам и методам прототипа объекта контекста. Это связано с проблемой безопасности, описанной здесь: https://mahmoudsec.blogspot.com/2019/04/handlebars-template-injection-and-rce.html
См. Https://github.com/wycats/handlebars.js/issues/1642.
Если вы уверены, что только разработчики имеют доступ к шаблонам, можно разрешить доступ к прототипу, установив следующий пакет:
Если вы используете экспресс-руль, вы должны действовать следующим образом:
источник
Было нарушение изменений в недавнем выпуске Рулей , который вызвал эту ошибку.
Вы можете просто добавить конфигурации, которые они предлагают, в свою документацию, однако помните, что в зависимости от вашей реализации это может привести к уязвимости к атакам XXS и RCE.
https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access
источник
Создание другого нового объекта или массива из данных, возвращаемых,
find()
решит проблему. Смотрите ниже простую иллюстрациюисточник