"Wow, ini berhasil, mengapa hal ini terjadi? Saat ini saya menggunakan setang ekspres (3.1.0) yang saya tetapkan sebagai mesin render di aplikasi kilat saya." - Lee Boon Kong 12 Jan pada 14:13
"Di masa lalu, Handlebars akan memungkinkan Anda untuk mengakses metode prototipe dan properti dari objek input dari templat ... Berbagai masalah keamanan berasal dari perilaku ini ... Di handlebars@^4.6.0. Akses ke objek prototipe memiliki telah dinonaktifkan sepenuhnya. Sekarang, jika Anda menggunakan kelas khusus sebagai input ke Setang, kode Anda tidak akan berfungsi lagi ... Paket ini secara otomatis menambahkan opsi runtime untuk setiap panggilan templat, menonaktifkan pembatasan keamanan ... Jika pengguna Anda menulis template dan Anda menjalankannya di server Anda, Anda TIDAK boleh menggunakan paket ini, tetapi mencari cara lain untuk memecahkan masalah ...Saya sarankan Anda mengonversi instance-class Anda ke objek JavaScript biasa sebelum meneruskannya ke fungsi templat. Setiap properti atau fungsi yang Anda akses, harus merupakan "milik sendiri" dari induknya. "- README
Lebih detail di sini:
https://www.npmjs.com/package/@handlebars/allow-prototype-access
METODE KEAMANAN CEPAT DAN KOTOR
Penggunaan ( express-handlebars
dan mongoose
):
express-handlebars
tidak memungkinkan Anda untuk menentukan opsi runtime untuk diteruskan ke fungsi templat. Paket ini dapat membantu Anda menonaktifkan pemeriksaan prototipe untuk model Anda.
"Hanya lakukan ini, jika Anda memiliki kendali penuh atas templat yang dieksekusi di server."
Langkah:
1 - Instal dependensi
npm i @handlebars/allow-prototype-access
2 - Gunakan cuplikan ini sebagai contoh untuk menulis ulang server ekspres Anda
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 - Jalankan server dan lakukan tarian bahagia Anda.
METODE LEBIH LANJUT AMAN
Sebelum meneruskan objek yang dikembalikan oleh panggilan AJAX Anda ke templat Handlebars, petakan objek tersebut ke objek baru dengan setiap properti atau fungsi yang perlu Anda akses di .hbs
file Anda . Di bawah ini Anda dapat melihat objek baru yang dibuat sebelum meneruskannya ke template Handlebars.
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));
});
Permintaan luwak Anda
Perbaiki saya jika saya salah, tetapi saya pikir ini mungkin berfungsi untuk kueri Anda ...
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;
});