Estoy usando un backend Nodejs con representación del lado del servidor usando manillares. Después de leer una doc
matriz de objetos del manillar, que contiene "contenido" y "de" clave. Sin embargo, cuando intento usar #each
para recorrer la matriz de objetos, aparece el error "Manillares: acceso denegado para resolver la propiedad" desde "porque no es una" propiedad propia "de su padre".
Intenté console.log () los datos que obtuve en la matriz de documentos y todo parece estar bien.
Para alguna perspectiva, esta es la consulta de mangosta,
agregué el objeto doc como una clave dentro de los 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 es la parte del archivo .hbs que estoy intentando recorrer:
{{#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}}
fuente
Si usa mangosta, este problema puede resolverse usando .lean () para obtener un objeto json (en lugar de una mangosta):
fuente
Hoy tengo la misma advertencia del manillar y la vista está vacía. A continuación se muestra cómo arreglé eso:
el archivo users.hbs
Crear un nuevo Objeto completo
context
con sus propias propiedades y luego pasarlo a la función de renderizado solucionará el problema ...Nota:
Cuando no creamos un nuevo Objeto, es fácil exponer accidentalmente información confidencial, o información que podría comprometer la seguridad del proyecto, mapear los datos que se devuelven de la base de datos y pasar solo lo que se necesita a la vista podría ser una buena práctica ...
fuente
"Wow, esto funcionó, ¿por qué está sucediendo esto? Actualmente estoy usando express-handlebars (3.1.0) que configuré como motor de renderizado en mi aplicación express". - Lee Boon Kong 12 de enero a las 14:13
"En el pasado, Handlebars le permitía acceder a métodos prototipo y propiedades del objeto de entrada desde la plantilla ... Múltiples problemas de seguridad han surgido de este comportamiento ... En handlebars@^4.6.0. El acceso al prototipo de objeto tiene se ha deshabilitado por completo. Ahora, si usa clases personalizadas como entrada para Manillares, su código ya no funcionará ... Este paquete agrega automáticamente opciones de tiempo de ejecución a cada plantilla de llamadas, deshabilitando las restricciones de seguridad ... Si sus usuarios están escribiendo plantillas y las ejecutas en tu servidor NO debes usar este paquete, sino encontrar otras formas de resolver el problema ...Le sugiero que convierta sus instancias de clase en objetos JavaScript simples antes de pasarlos a la función de plantilla. Cada propiedad o función a la que acceda debe ser una "propiedad propia" de su padre ". - README
Más detalles aquí: https://www.npmjs.com/package/@handlebars/allow-prototype-access
MÉTODO MÁS SEGURO Y SEGURO
Antes de pasar el objeto devuelto por su llamada AJAX a la plantilla Handlebars, asigne un objeto nuevo con cada propiedad o función a la que necesite acceder en su
.hbs
archivo. A continuación puede ver el nuevo objeto hecho antes de pasarlo a la plantilla de Manillares.Su consulta de mangosta
Corrígeme si me equivoco, pero creo que esto podría funcionar para tu consulta ...
fuente
pruebe npm install handlebars versión 4.5.3
npm install [email protected]
Funciono para mi
fuente
A partir de la versión 4.6.0 en adelante, Handlebars prohíbe el acceso a propiedades de prototipo y métodos del objeto de contexto de forma predeterminada. Esto está relacionado con un problema de seguridad descrito aquí: https://mahmoudsec.blogspot.com/2019/04/handlebars-template-injection-and-rce.html
Consulte https://github.com/wycats/handlebars.js/issues/1642
Si está seguro de que solo los desarrolladores tienen acceso a las plantillas, es posible permitir el acceso al prototipo instalando el siguiente paquete:
Si está utilizando el manillar express, debe proceder como:
fuente
Hubo un cambio importante en el reciente lanzamiento de Handlebars que causó este error.
Simplemente puede agregar las configuraciones que sugieren en su documentación, sin embargo, tenga en cuenta que, dependiendo de su implementación, esto podría generar la vulnerabilidad a los ataques XXS y RCE.
https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access
fuente
La creación de otro nuevo objeto o matriz a partir de los datos devueltos por
find()
resolverá el problema. Vea a continuación una ilustración simplefuente