Saya menggunakan backend Nodejs dengan rendering sisi server menggunakan setang. Setelah membaca doc
berbagai objek dari setang, yang berisi kunci "konten" dan "dari". Namun ketika saya mencoba menggunakan #each
untuk loop melalui array objek, kesalahan "Setang: Akses telah ditolak untuk menyelesaikan properti" dari "karena itu bukan" milik sendiri "dari induknya" muncul.
Saya sudah mencoba untuk console.log () data yang telah saya ambil dalam array doc dan semuanya tampak baik-baik saja.
Untuk beberapa perspektif, ini adalah query luwak,
saya telah menambahkan objek doc sebagai kunci di dalam argumen res.render.
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;
});
Ini adalah bagian dari file .hbs yang saya coba lewati:
{{#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}}
sumber
Jika menggunakan luwak, masalah ini dapat diselesaikan dengan menggunakan .lean () untuk mendapatkan objek json (bukan yang luwak):
sumber
Hari ini saya mendapat peringatan yang sama dari setang dan tampilan kosong. Di bawah ini adalah bagaimana saya memperbaikinya:
file users.hbs
Membuat seluruh objek baru bernama
context
dengan propertinya sendiri lalu meneruskannya ke dalam fungsi render akan memperbaiki masalah ...catatan:
Ketika kita tidak membuat Obyek baru, mudah untuk secara tidak sengaja memaparkan informasi rahasia, atau informasi yang dapat membahayakan keamanan projet, memetakan data yang dikembalikan dari database dan hanya meneruskan apa yang diperlukan ke tampilan bisa menjadi praktik yang baik ...
sumber
"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 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.Permintaan luwak Anda
Perbaiki saya jika saya salah, tetapi saya pikir ini mungkin berfungsi untuk kueri Anda ...
sumber
coba npm instal setang versi 4.5.3
npm instal [email protected]
Ini berhasil untuk saya
sumber
Mulai dari versi 4.6.0 dan seterusnya, Setang melarang mengakses properti prototipe dan metode objek konteks secara default. Ini terkait dengan masalah keamanan yang dijelaskan di sini: https://mahmoudsec.blogspot.com/2019/04/handlebars-template-injection-and-rce.html
Rujuk ke https://github.com/wycats/handlebars.js/issues/1642
Jika Anda yakin bahwa hanya pengembang yang memiliki akses ke templat, dimungkinkan untuk mengizinkan akses prototipe dengan menginstal paket berikut:
Jika Anda menggunakan setang ekspres, Anda harus melanjutkan sebagai:
sumber
Terjadi perubahan besar pada rilis Setang baru-baru ini yang menyebabkan kesalahan ini.
Anda bisa menambahkan konfigurasi yang mereka sarankan dalam dokumentasi mereka, namun waspadalah, tergantung pada implementasi Anda, ini dapat menyebabkan kerentanan terhadap serangan XXS dan RCE.
https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access
sumber
Membuat Objek atau Array baru lain dari data yang dikembalikan oleh
find()
akan memecahkan masalah. Lihat di bawah ini ilustrasi sederhanasumber