"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
SCHNELLE UND SCHMUTZIGE SICHERHEITSMETHODE
Verwendung ( express-handlebars
und mongoose
):
express-handlebars
Sie können keine Laufzeitoptionen angeben, die an die Vorlagenfunktion übergeben werden sollen. Mit diesem Paket können Sie Prototypprüfungen für Ihre Modelle deaktivieren.
"Tun Sie dies nur, wenn Sie die volle Kontrolle über die Vorlagen haben, die auf dem Server ausgeführt werden."
Schritte:
1 - Abhängigkeit installieren
npm i @handlebars/allow-prototype-access
2 - Verwenden Sie dieses Snippet als Beispiel, um Ihren Express-Server neu zu schreiben
const express = require('express');
const mongoose = require('mongoose');
const Handlebars = require('handlebars');
const exphbs = require('express-handlebars');
// Import function exported by newly installed node modules.
const { allowInsecurePrototypeAccess } = require('@handlebars/allow-prototype->access');
const PORT = process.env.PORT || 3000;
const app = express();
const routes = require('./routes');
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
app.use(express.static('public'));
// When connecting Handlebars to the Express app...
app.engine('handlebars', exphbs({
defaultLayout: 'main',
// ...implement newly added insecure prototype access
handlebars: allowInsecurePrototypeAccess(Handlebars)
})
);
app.set('view engine', 'handlebars');
app.use(routes);
const MONGODB_URI = process.env.MONGODB_URI || >'mongodb://localhost/dbName';
mongoose.connect(MONGODB_URI);
app.listen(PORT, function () {
console.log('Listening on port: ' + PORT);
});
3 - Führen Sie den Server aus und tanzen Sie fröhlich.
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.
const router = require("express").Router();
const db = require("../../models");
router.get("/", function (req, res) {
db.Article.find({ saved: false })
.sort({ date: -1 })
.then(oldArticleObject => {
const newArticleObject = {
articles: oldArticleObject.map(data => {
return {
headline: data.headline,
summary: data.summary,
url: data.url,
date: data.date,
saved: data.saved
}
})
}
res.render("home", {
articles: newArticleObject.articles
})
})
.catch(error => res.status(500).send(error));
});
Ihre Mungo-Anfrage
Korrigieren Sie mich, wenn ich falsch liege, aber ich denke, dass dies für Ihre Anfrage funktionieren könnte ...
Confession.find()
.sort({ date: -1 })
.then(function (oldDoc) {
for (var i = 0; i < oldDoc.length; i++) {
//Check whether sender is anonymous
if (oldDoc[i].from === "" || oldDoc[i].from == null) {
oldDoc[i].from = "Anonymous";
}
//Add an extra JSON Field for formatted date
oldDoc[i].formattedDate = formatTime(oldDoc[i].date);
}
const newDoc = {
doc: oldDoc.map(function (data) {
return {
from: data.from,
formattedDate: data.formattedDate
}
})
}
res.render('index', { title: 'Confession Box', success: req.session.success, errors: req.session.errors, confession: newDoc.doc });
req.session.errors = null;
req.session.success = null;
});