"ว้าวใช้งานได้แล้วทำไมมันถึงเกิดขึ้นตอนนี้ฉันกำลังใช้งานแฮนดายบาร์ (3.1.0) ซึ่งฉันตั้งเป็นเอ็นจิ้นการเรนเดอร์ในแอพด่วนของฉัน" - ลีบุญกง 12 ม.ค. เวลา 14:13 น
"ในอดีตมือจับจะอนุญาตให้คุณเข้าถึงวิธีการต้นแบบและคุณสมบัติของวัตถุอินพุตจากแม่แบบ ... ปัญหาด้านความปลอดภัยหลายอย่างมาจากพฤติกรรมนี้ ... ใน handlebars@^4.6.0 การเข้าถึงวัตถุต้นแบบมี ถูกปิดใช้งานอย่างสมบูรณ์. ตอนนี้ถ้าคุณใช้คลาสที่กำหนดเองเป็น input เพื่อแฮนด์รหัสของคุณจะไม่ทำงานอีกต่อไป ... แพคเกจนี้จะเพิ่มตัวเลือกให้กับแต่ละรันไทม์แม่แบบสายปิดการใช้งานข้อ จำกัด การรักษาความปลอดภัย ... หากผู้ใช้ของคุณเขียน แม่แบบและคุณรันมันบนเซิร์ฟเวอร์ของคุณคุณไม่ควรใช้แพ็คเกจนี้ แต่หาวิธีอื่นในการแก้ปัญหา ...ฉันขอแนะนำให้คุณแปลงคลาสอินสแตนซ์ของคุณเป็นวัตถุ JavaScript ธรรมดาก่อนส่งต่อไปยังฟังก์ชันเทมเพลต ทุกคุณสมบัติหรือฟังก์ชั่นที่คุณเข้าถึงจะต้องเป็น "คุณสมบัติของตัวเอง" ของแม่ของมัน "- README
รายละเอียดเพิ่มเติมได้ที่นี่:
https://www.npmjs.com/package/@handlebars/allow-prototype-access
วิธีที่ไม่ปลอดภัยอย่างรวดเร็วและสกปรก
การใช้งาน ( express-handlebars
และmongoose
):
express-handlebars
ไม่อนุญาตให้คุณระบุตัวเลือกรันไทม์เพื่อส่งผ่านไปยังฟังก์ชันเทมเพลต แพคเกจนี้สามารถช่วยคุณปิดการตรวจสอบต้นแบบสำหรับรุ่นของคุณ
"ทำสิ่งนี้หากคุณสามารถควบคุมเทมเพลตที่ดำเนินการในเซิร์ฟเวอร์ได้อย่างสมบูรณ์"
ขั้นตอน:
1 - ติดตั้งการพึ่งพา
npm i @handlebars/allow-prototype-access
2 - ใช้ตัวอย่างนี้เป็นตัวอย่างเพื่อเขียนเซิร์ฟเวอร์ด่วนของคุณ
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 - เรียกใช้เซิร์ฟเวอร์และเต้นอย่างมีความสุข
อีกต่อไปวิธีที่ปลอดภัย
ก่อนส่งผ่านวัตถุที่ส่งคืนโดยการเรียก AJAX ของคุณไปยังเทมเพลต Handlebars ให้แมปวัตถุใหม่กับคุณสมบัติหรือฟังก์ชันที่คุณต้องการเข้าถึงใน.hbs
ไฟล์ของคุณ ด้านล่างคุณสามารถเห็นวัตถุใหม่ที่สร้างขึ้นก่อนส่งผ่านไปยังเทมเพลตแฮนด์บาร์
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));
});
แบบสอบถามพังพอนของคุณ
แก้ไขฉันถ้าฉันผิด แต่ฉันคิดว่านี่อาจจะเป็นไปได้สำหรับการค้นหาของคุณ ...
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;
});