"Vay canına, bu neden oluyor? Şu anda hızlı uygulamamda bir render motoru olarak ayarladığım ekspres gidonları (3.1.0) kullanıyorum." - Lee Boon Kong 12 Ocak saat 14:13
"Geçmişte, Gidonlar, şablondan giriş nesnesinin prototip yöntemlerine ve özelliklerine erişmenize izin verirdi ... Bu davranıştan birden fazla güvenlik sorunu oluştu ... Gidon@^4.6.0. Nesne prototipine erişim Şimdi, Gidonlara giriş olarak özel sınıflar kullanırsanız, kodunuz artık çalışmaz ... Bu paket her şablon çağrısına otomatik olarak çalışma zamanı seçenekleri ekler, güvenlik kısıtlamalarını devre dışı bırakır ... Kullanıcılarınız yazıyorsa şablonları ve bunları sunucunuzda yürüttüğünüzde, bu paketi KULLANMAMALISINIZ, ancak daha çok sorunu çözmek için başka yollar bulmalısınız ...Sınıf örneklerinizi şablon işlevine geçirmeden önce düz JavaScript nesnelerine dönüştürmenizi öneririm. Eriştiğiniz her özellik veya işlev, üst öğesinin "kendi mülkü" olmalıdır. - README
Daha fazla ayrıntı burada:
https://www.npmjs.com/package/@handlebars/allow-prototype-access
HIZLI VE KİRLİ GÜVENLİK YÖNTEMİ
Kullanımı ( express-handlebars
ve mongoose
):
express-handlebars
şablon işlevine geçmesi için çalışma zamanı seçeneklerini belirtmenize izin vermez. Bu paket, modelleriniz için prototip kontrollerini devre dışı bırakmanıza yardımcı olabilir.
"Bunu yalnızca sunucuda yürütülen şablonlar üzerinde tam denetime sahipseniz yapın."
Adımlar:
1 - Kurulum bağımlılığı
npm i @handlebars/allow-prototype-access
2 - Bu snippet'i hızlı sunucunuzu yeniden yazmak için örnek olarak kullanın
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 - Sunucuyu çalıştırın ve mutlu dansınızı yapın.
DAHA UZUN DAHA GÜVENLİ YÖNTEM
AJAX çağrınız tarafından döndürülen nesneyi Gidon şablonuna geçirmeden önce, .hbs
dosyanızda erişmeniz gereken her özellik veya işlevle yeni bir nesneye eşleyin . Aşağıda, Gidon şablonuna geçmeden önce yapılan yeni nesneyi görebilirsiniz.
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));
});
Firavun faresi sorgunuz
Yanlışsam beni düzeltin ama bu sorgunuz için işe yarayabilir diye düşünüyorum ...
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;
});