Gidonlar: Üst öğesinin "kendi mülkü" olmadığı için erişimin "gönderen" özelliğini çözümlemesi reddedildi


15

Gidon kullanarak sunucu tarafı oluşturma ile bir Nodejs arka uç kullanıyorum. docGidonlardan anahtar "içerik" ve "from" içeren bir dizi nesne okuduktan sonra . Ancak #eachnesneler dizisi arasında döngü için kullanmaya çalıştığınızda , "Gidon: Access", "üst" kendi özelliği "olmadığı için özelliği çözmek için engellendi" hatası görünür.

Console.log () doc dizi getirilen veri denedim ve her şey iyi görünüyor.

Bazı bakış açıları için, bu
Firavun faresi sorgusu, res.render argümanlarına bir nesne olarak doc belgesini ekledim.

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;
  });

Bu üzerinden döngü çalışıyorum .hbs dosya kısmı:

 {{#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}}

Yanıtlar:


25

gidonlar için bir dev bağımlılık yükleyerek bu sorunu çözmek

npm i -D handlebars@4.5.0


Vay canına, bu neden oluyor? Şu anda ekspres uygulamamda bir render motoru olarak ayarladığım ekspres gidonları (3.1.0) kullanıyorum.
Lee Boon Kong

Bunun bazı kısıtlamalar nedeniyle gidonun yeni sürümünde gerçekleştiğinden şüpheleniyorum, ancak bu kısıtlamalar üzerinde nasıl çalışacağımı bilmiyorum.
Lee Boon Kong

Sorun, gidonları destekleyen ekspres eklentisi arasında yer alıyor, ancak gidon 4.5.0 ön ucunuzun ana motoru olarak kullanılmak üzere kaydedildiğinde, lütfen bu konuda yorum yaparak bana bildirin.
Mason

Bu çalışmıyor. Ben npm i -D handlebars@4.5.0
Deepak Thakur


12

Mongoose kullanılıyorsa, bir json nesnesi almak için .lean () kullanılarak bu sorun çözülebilir (mongoose yerine):

dbName.find({}).lean()
  // execute query
  .exec(function(error, body) {
     //Some code
  });

3
çok yaşa! YAŞAM TASARRUFU!
Nick Thenick

1
Sorun değil, memnun oldu !!
Billeh

2
bu cevabı bir kereden fazla onaylayabilseydim .. haha ​​Çok teşekkür ederim!
Abdus

7

Bugün gidonlardan aynı uyarıyı alıyorum ve manzara boş. Aşağıda bunu nasıl düzelttim:

//  * USERS PAGE
// @description        users route
// @returns           ../views/users.hbs
router.get('/users', async (req, res) => {
  // get all items from db collection
  const collection = 'User'
  await dbFindAllDocs(collection) // <=> wrapper for Model.find() ...
    .then(documents => {
      // create context Object with 'usersDocuments' key
      const context = {
        usersDocuments: documents.map(document => {
          return {
            name: document.name,
            location: document.location
          }
        })
      }
      // rendering usersDocuments from context Object
      res.render('users', {
        usersDocuments: context.usersDocuments
      })
    })
    .catch(error => res.status(500).send(error))
})

users.hbs dosyası

<ul>
{{#each usersDocuments}}
<li>name: {{this.name}} location: {{this.location}}</li>
{{/each}}    
</ul>

contextKendi özellikleriyle adlandırılmış yeni bir Nesne oluşturmak ve ardından render fonksiyonuna iletmek sorunu çözecektir ...

Not:

Yeni bir Nesne yaratmadığımızda, gizli bilgileri veya projektörün güvenliğini tehlikeye atabilecek bilgileri, veritabanından döndürülen verileri eşleştirip yalnızca gerekli olanı görünüme geçirmek için yanlışlıkla ifşa etmek kolaydır. ...


Cevaplarınız için teşekkürler! Verilerin istenmeyen şekilde açılmasını önlemek için yeni bir nesne oluşturmak daha iyi görünüyor.
Lee Boon Kong

Bu çalışma için teşekkürler.
GNETO DOMINIQUE

Hazırlanan listeden yeni liste hazırlayarak render yapmak için 2 kat daha fazla zaman harcamıyor mu?
mustafiz012

6

"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-handlebarsve 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, .hbsdosyanı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;
    });

5

denemek npm yüklemek gidon sürüm 4.5.3

npm yükleme gidon@4.5.3

Benim için çalıştı


Bu bir yorum olmalı
Arun Vinoth

Şu anda ekspres gidonlar kullanıyordum, sürüm 3.1.0
Lee Boon Kong

Teşekkürler, her ikisini de denedim ve @ Mason'un anwser'ı işe yarayacaktı, ama bunun neden olduğundan emin değilim.
Lee Boon Kong

3

4.6.0 sürümünden itibaren, Gidonlar varsayılan olarak bağlam nesnesinin prototip özelliklerine ve yöntemlerine erişmeyi yasaklar. Bu, burada açıklanan bir güvenlik sorunuyla ilgilidir: https://mahmoudsec.blogspot.com/2019/04/handlebars-template-injection-and-rce.html

Bkz. Https://github.com/wycats/handlebars.js/issues/1642

Yalnızca geliştiricilerin şablonlara erişebileceğinden eminseniz, aşağıdaki paketi yükleyerek prototip erişimine izin vermek mümkündür:

npm i @handlebars/allow-prototype-access

Ekspres gidon kullanıyorsanız, şu şekilde devam etmelisiniz:

const 
    express = require('express'),
    _handlebars = require('handlebars'),
    expressHandlebars = require('express-handlebars'),
    {allowInsecurePrototypeAccess} = require('@handlebars/allow-prototype-access')

const app = express()

app.engine('handlebars', expressHandlebars({
    handlebars: allowInsecurePrototypeAccess(_handlebars)
}))
app.set('view engine', 'handlebars')

Teşekkürler bu çalıştı. Peki, her zaman ekspres gidonu kullanmamız gerektiğinde buna ihtiyacımız var mı?
Yash Boura

2

Gidonların son sürümünde bu hataya neden olan bir değişiklik oldu.

Belgelerinde önerdikleri konfigürasyonları ekleyebilir, ancak uygulamanıza bağlı olarak bu durumun XXS ve RCE saldırılarına neden olabileceğini unutmayın.

https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access

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}, {

      // Options to allow access to the properties and methods which as causing the error.

      allowProtoMethodsByDefault: true,
      allowProtoPropertiesByDefault: true

    });

    req.session.errors = null;
    req.session.success = null;
  });

Ahhh bu yüzden seçenekleri ekliyorum, çok teşekkürler!
Lee Boon Kong

1
Bu benim için işe yaramadı. Bir seçenekler nesnesi değil, bir geri arama bekleniyordu.
mrg95

0

Tarafından döndürülen verilerden yeni bir Nesne veya Dizi oluşturmak find() sorunu çözecektir. Basit bir resme bakın

app.get("/",(req,res)=>{

 let com = require('./MODELCOM')    // loading model
 let source=fs.readFileSync(__dirname+"/views/template.hbs","utf-8");

 com.find((err,data)=>{
    // creation new array  using map
   let wanted = data.map(doc=>{
       return {
           name:doc.name,
           _id:doc._id
        }
   })

    let html= handlebar.compile(source);
  fs.writeFileSync(__dirname+"/views/reciever.html",html({communities:wanted}))
    res.sendFile(__dirname+"/views/reciever.html")
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.