Ich verwende ein Nodejs-Backend mit serverseitigem Rendering über den Lenker. Nach dem Lesen eines doc
Arrays von Objekten aus dem Lenker, das die Schlüssel "Inhalt" und "Von" enthält. Wenn ich jedoch versuche, #each
das Array von Objekten zu durchlaufen, wird der Fehler "Lenker: Zugriff verweigert, um die Eigenschaft" von "aufzulösen, da es sich nicht um eine" eigene Eigenschaft "des übergeordneten Objekts handelt.
Ich habe versucht, die Daten, die ich im doc-Array abgerufen habe, zu console.log (), und alles scheint in Ordnung zu sein.
In mancher Hinsicht ist dies die Mungo-Abfrage.
Ich habe das Objektdokument als Schlüssel in den res.render-Argumenten hinzugefügt.
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;
});
Dies ist der Teil der .hbs-Datei, den ich durchlaufen möchte:
{{#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}}
quelle
Wenn Sie Mungo verwenden, kann dieses Problem mithilfe von .lean () behoben werden, um ein JSON-Objekt (anstelle eines Mungos) abzurufen:
quelle
Heute habe ich die gleiche Warnung vom Lenker und die Ansicht ist leer. Unten ist, wie ich das behoben habe:
die Datei users.hbs
Das Erstellen eines neuen Objekts
context
mit eigenen Eigenschaften und die Übergabe an die Renderfunktion behebt das Problem ...Hinweis:
Wenn wir kein neues Objekt erstellen, ist es leicht, versehentlich vertrauliche Informationen oder Informationen, die die Sicherheit des Projekts gefährden könnten, offenzulegen, die von der Datenbank zurückgegebenen Daten zuzuordnen und nur das zu übergeben, was für die Ansicht erforderlich ist ...
quelle
"Wow, das hat funktioniert. Warum passiert das? Ich verwende derzeit Express-Lenker (3.1.0), die ich in meiner Express-App als Render-Engine festgelegt habe." - Lee Boon Kong 12. Januar um 14:13 Uhr
"In der Vergangenheit haben Sie mit Lenkern über die Vorlage auf Prototypmethoden und -eigenschaften des Eingabeobjekts zugegriffen ... Dieses Verhalten hat mehrere Sicherheitsprobleme verursacht ... In handlebars@^4.6.0. Zugriff auf den Objektprototyp wurde vollständig deaktiviert. Wenn Sie jetzt benutzerdefinierte Klassen als Eingabe für Lenker verwenden, funktioniert Ihr Code nicht mehr ... Dieses Paket fügt jedem Vorlagenaufruf automatisch Laufzeitoptionen hinzu und deaktiviert die Sicherheitsbeschränkungen ... Wenn Ihre Benutzer schreiben Vorlagen und Sie führen sie auf Ihrem Server aus. Sie sollten dieses Paket NICHT verwenden, sondern andere Wege finden, um das Problem zu lösen ...Ich schlage vor, dass Sie Ihre Klasseninstanzen in einfache JavaScript-Objekte konvertieren, bevor Sie sie an die Vorlagenfunktion übergeben. Jede Eigenschaft oder Funktion, auf die Sie zugreifen, muss eine "eigene Eigenschaft" des übergeordneten Elements sein. "- README
Weitere Informationen finden Sie hier: https://www.npmjs.com/package/@handlebars/allow-prototype-access
LÄNGERE SICHERE METHODE
Bevor Sie das von Ihrem AJAX-Aufruf zurückgegebene Objekt an die Handlebars-Vorlage übergeben, ordnen Sie es mit jeder Eigenschaft oder Funktion, auf die Sie in Ihrer
.hbs
Datei zugreifen müssen, einem neuen Objekt zu . Unten sehen Sie das neue Objekt, das erstellt wurde, bevor es an die Lenkervorlage übergeben wurde.Ihre Mungo-Anfrage
Korrigieren Sie mich, wenn ich falsch liege, aber ich denke, dass dies für Ihre Anfrage funktionieren könnte ...
quelle
versuchen Sie npm Install Lenker Version 4.5.3
npm installiere [email protected]
Es hat bei mir funktioniert
quelle
Ab Version 4.6.0 verbietet Handlebars standardmäßig den Zugriff auf Prototypeneigenschaften und -methoden des Kontextobjekts. Dies hängt mit einem hier beschriebenen Sicherheitsproblem zusammen: https://mahmoudsec.blogspot.com/2019/04/handlebars-template-injection-and-rce.html
Siehe https://github.com/wycats/handlebars.js/issues/1642
Wenn Sie sicher sind, dass nur Entwickler Zugriff auf die Vorlagen haben, können Sie den Prototypzugriff zulassen, indem Sie das folgende Paket installieren:
Wenn Sie einen Express-Lenker verwenden, gehen Sie wie folgt vor:
quelle
In der jüngsten Version von Lenker gab es eine grundlegende Änderung, die diesen Fehler verursacht hat.
Sie können einfach die Konfigurationen hinzufügen, die sie in ihrer Dokumentation vorschlagen. Beachten Sie jedoch, dass dies abhängig von Ihrer Implementierung zu einer Anfälligkeit für XXS- und RCE-Angriffe führen kann.
https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access
quelle
Das Erstellen eines weiteren neuen Objekts oder Arrays aus den von zurückgegebenen Daten
find()
löst das Problem. Siehe unten eine einfache Abbildungquelle