Estou usando um back-end do Nodejs com renderização do lado do servidor usando guidão. Depois de ler uma doc
variedade de objetos no guidão, que contém os principais "conteúdo" e "de". No entanto, quando tento usar o #each
loop pela matriz de objetos, o erro "Guiador: acesso foi negado para resolver a propriedade" from "porque não é uma" propriedade própria "de seu pai" é exibida.
Eu tentei console.log () os dados que eu busquei na matriz de documentos e tudo parece bem.
Para alguma perspectiva, esta é a consulta mangusto,
adicionei o objeto doc como uma chave nos argumentos 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;
});
Esta é a parte do arquivo .hbs que estou tentando fazer um loop:
{{#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}}
fonte
Se estiver usando o mangusto, esse problema pode ser resolvido usando .lean () para obter um objeto json (em vez de um mangusto):
fonte
Hoje eu tenho o mesmo aviso no guidão e a vista está vazia. Abaixo está como eu consertei isso:
o arquivo users.hbs
Criar um novo objeto inteiro
context
com suas próprias propriedades e depois passá-lo para a função de renderização corrigirá o problema ...Nota:
Quando não criamos um novo Objeto, é fácil expor acidentalmente informações confidenciais ou informações que possam comprometer a segurança do projeto, mapear os dados retornados do banco de dados e passar apenas o necessário para a exibição pode ser uma boa prática. ...
fonte
"Uau, isso funcionou. Por que isso está acontecendo? No momento, estou usando o guidão expresso (3.1.0), que defini como mecanismo de renderização no meu aplicativo expresso." - Lee Boon Kong 12/01 às 14:13
"No passado, o Handlebars permitia acessar métodos e propriedades do protótipo do objeto de entrada do modelo ... Vários problemas de segurança surgiram desse comportamento ... No handlebars@^4.6.0. O acesso ao protótipo do objeto foi Agora, se você usar classes personalizadas como entrada no guidão, seu código não funcionará mais ... Este pacote adiciona automaticamente opções de tempo de execução a cada chamada de modelo, desativando as restrições de segurança ... Se seus usuários estiverem escrevendo modelos e você os executa no servidor, NÃO deve usar este pacote, mas sim encontrar outras maneiras de resolver o problema ...Sugiro que você converta suas instâncias de classe em objetos JavaScript simples antes de passá-los para a função de modelo. Toda propriedade ou função que você acessa deve ser uma "propriedade própria" de seu pai. "- README
Mais detalhes aqui: https://www.npmjs.com/package/@handlebars/allow-prototype-access
MÉTODO MAIS SEGURO E MAIS SEGURO
Antes de passar o objeto retornado pela sua chamada AJAX para o modelo do Handlebars, mapeie-o em um novo objeto com cada propriedade ou função que você precisa acessar em seu
.hbs
arquivo. Abaixo, você pode ver o novo objeto criado antes de passá-lo para o modelo do guidão.Sua consulta mangusto
Corrija-me se estiver errado, mas acho que isso pode funcionar para sua consulta ...
fonte
tente o npm install handlebars versão 4.5.3
npm install [email protected]
Funcionou para mim
fonte
A partir da versão 4.6.0 em diante, o Handlebars proíbe o acesso a propriedades e métodos de protótipo do objeto de contexto por padrão. Isso está relacionado a um problema de segurança descrito aqui: https://mahmoudsec.blogspot.com/2019/04/handlebars-template-injection-and-rce.html
Referir-se https://github.com/wycats/handlebars.js/issues/1642
Se você tem certeza de que apenas os desenvolvedores têm acesso aos modelos, é possível permitir o acesso ao protótipo instalando o seguinte pacote:
Se você estiver usando guidão expresso, proceda da seguinte forma:
fonte
Houve uma mudança na versão recente do guidão que causou esse erro.
Você pode simplesmente adicionar as configurações sugeridas em sua documentação; no entanto, esteja ciente de que, dependendo da sua implementação, isso pode levar a vulnerabilidade a ataques XXS e RCE.
https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access
fonte
Criar outro novo objeto ou matriz a partir dos dados retornados por
find()
resolverá o problema. Veja abaixo uma ilustração simplesfonte