হ্যান্ডলবার্স: সম্পত্তিটি "থেকে" সমাধান করার জন্য অ্যাক্সেসকে অস্বীকার করা হয়েছে কারণ এটি তার পিতামাতার একটি "নিজস্ব সম্পত্তি" নয়


15

আমি হ্যান্ডেলবারগুলি ব্যবহার করে সার্ভার-সাইড রেন্ডারিং সহ একটি নোডেজ ব্যাকএন্ড ব্যবহার করছি। docহ্যান্ডেলবারগুলি থেকে একটি অ্যারে অবজেক্ট পড়ার পরে , এতে কী "সামগ্রী" এবং "থেকে" থাকে। তবে আমি যখন #eachঅবজেক্টগুলির অ্যারের মধ্য দিয়ে লুপটি ব্যবহার করার চেষ্টা করব তখন ত্রুটি "হ্যান্ডলবারস: অ্যাক্সেসটি সম্পত্তি থেকে" সমাধান করতে অস্বীকার করা হয়েছে কারণ এটি তার পিতামাতার একটি "নিজস্ব সম্পত্তি" নয়।

আমি ডক অ্যারেটিতে যে তথ্য এনেছি এবং কনসোল.লগ () করার চেষ্টা করেছি এবং সবকিছু ঠিক আছে বলে মনে হচ্ছে।

কিছু দৃষ্টিকোণের জন্য, এটি মঙ্গুজের ক্যোয়ারী,
আমি অবজেক্ট ডকটিকে রেস.রেন্ডার যুক্তিগুলির ভিতরে একটি কী হিসাবে যুক্ত করেছি।

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

এটি আমি .hbs ফাইলের অংশটি লুপ করার চেষ্টা করছি:

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

উত্তর:


25

আমি হ্যান্ডেলবারগুলির জন্য ডেভ নির্ভরতা ইনস্টল করে এই সমস্যাটি সমাধান করি

npm i -D handlebars@4.5.0


বাহ এটি কাজ করেছে, যদিও কেন এটি হচ্ছে? আমি বর্তমানে এক্সপ্রেস-হ্যান্ডেলবারগুলি (3.1.0) ব্যবহার করছি যা আমি আমার এক্সপ্রেস অ্যাপে রেন্ডার ইঞ্জিন হিসাবে সেট করেছি।
লি বুন কং

আমি সন্দেহ করি যে কিছু বিধিনিষেধের কারণে হ্যান্ডেলবারগুলির নতুন সংস্করণে এটি ঘটছিল, তবে এই বিধিনিষেধগুলিতে কীভাবে কাজ করা যায় তা আমি জানি না।
লি বুন কং

ঠিক আছে, ইস্যুটি এক্সপ্রেস প্লাগইনগুলির মধ্যে রাখে যা হ্যান্ডেলবারগুলি সমর্থন করে, তবে একবার হ্যান্ডেলবারগুলি আপনার সীমান্তের প্রধান ইঞ্জিন হিসাবে ব্যবহার করার জন্য সংরক্ষণ করা হয়, দয়া করে আমাকে এ সম্পর্কে মন্তব্য করে জানান know
ম্যাসন

এটি কাজ করছে না। আমি এনপিএম আইডি-ডি হ্যান্ডেলবার্স @ ৪.৫.০ সম্পাদন করার পরেও একই সমস্যাটি পান
দীপক ঠাকুর

সঠিক উত্তরটি এখানে রয়েছে github.com/wycats/handlebars.js/issues/1642
দীপক ঠাকুর

12

যদি মঙ্গুজ ব্যবহার করে থাকে তবে এই ইস্যুটি জেসন অবজেক্ট পেতে (মঙ্গুসের পরিবর্তে) .lean () ব্যবহার করে সমাধান করা যেতে পারে:

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

3
আল্লাহ্ তোমার মঙ্গল করুক! লাইফ সেভার!
নিক থানিক

1
সমস্যা নেই, খুশী হয়েছে এটি !!
বিলেহ

2
আশা করি আমি এই উত্তরটি একাধিকবার উপস্থাপন করতে পারতাম .. হাহাহা আপনাকে অনেক ধন্যবাদ!
আবদুস

7

আজ আমার কাছে হ্যান্ডেলবারগুলি থেকে একই সতর্কতা রয়েছে এবং দৃশ্যটি খালি। নীচে আমি এটি স্থির করেছি:

//  * 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))
})

user.hbs ফাইল

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

contextনিজস্ব বৈশিষ্ট্যযুক্ত একটি সম্পূর্ণ নতুন অবজেক্ট তৈরি করা তারপরে এটি রেন্ডার ফাংশনে পাস করা সমস্যার সমাধান করবে ...

বিঃদ্রঃ:

যখন আমরা কোনও নতুন অবজেক্ট তৈরি করি না, তখন দুর্ঘটনাক্রমে গোপনীয় তথ্য, বা প্রজেক্টের সুরক্ষার সাথে আপোস করতে পারে এমন তথ্য প্রকাশ করা সহজ, ডাটাবেস থেকে ফিরে আসা ডেটা ম্যাপিং এবং কেবলমাত্র ভিউতে যা প্রয়োজন তা পাস করা ভাল অভ্যাস হতে পারে ...


ধন্যবাদ আপনার উত্তরের জন্য অনেক! ডাতাসের অবাঞ্ছিত এক্সপোজার রোধ করতে একটি নতুন অবজেক্ট তৈরি করা ভাল বলে মনে হয়।
লি বুন কং

এই কাজের জন্য ধন্যবাদ।
জিনেটো ডোমিনিয়াক

এটি প্রস্তুত তালিকা থেকে নতুন তালিকা প্রস্তুত করে রেন্ডার করতে 2x সময় ব্যয় করে না?
মোস্তাফিজ012

6

"বাহ এটি কাজ করেছে, যদিও এটি কেন হচ্ছে? আমি বর্তমানে এক্সপ্রেস-হ্যান্ডেলবারগুলি (৩.১.০) ব্যবহার করছি যা আমি আমার এক্সপ্রেস অ্যাপে রেন্ডার ইঞ্জিন হিসাবে সেট করেছি।" - লি বুন কং 12 জানুয়ারী 14:13 এ

"অতীতে, হ্যান্ডেলবারগুলি আপনাকে টেমপ্লেট থেকে প্রোটোটাইপ পদ্ধতি এবং ইনপুট অবজেক্টের বৈশিষ্ট্যগুলি অ্যাক্সেসের অনুমতি দেয় ... একাধিক সুরক্ষা সমস্যা এই আচরণ থেকে এসেছে ... হ্যান্ডেলবার্স ^^..6.০ তে অবজেক্টের প্রোটোটাইপটিতে অ্যাক্সেস রয়েছে সম্পূর্ণরূপে অক্ষম করা হয়েছে এখন, আপনি যদি হ্যান্ডলবারগুলিতে ইনপুট হিসাবে কাস্টম ক্লাস ব্যবহার করেন তবে আপনার কোডটি আর কাজ করবে না ... এই প্যাকেজটি স্বয়ংক্রিয়ভাবে প্রতিটি টেম্পলেট-কলগুলিতে সুরক্ষা বিধিনিষেধ অক্ষম করে রানটাইম বিকল্পগুলি যুক্ত করে ... যদি আপনার ব্যবহারকারীরা লিখছেন টেমপ্লেটগুলি এবং আপনি সেগুলি আপনার সার্ভারে চালিত করুন আপনার এই প্যাকেজটি ব্যবহার করা উচিত নয়, বরং সমস্যা সমাধানের জন্য অন্যান্য উপায়গুলি সন্ধান করা উচিত ...আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি আপনার শ্রেণি-দৃষ্টান্তগুলি টেম্পলেট ফাংশনে স্থান দেওয়ার আগে প্লে জাভাস্ক্রিপ্ট অবজেক্টে রূপান্তর করুন। প্রতিটি সম্পত্তি বা ফাংশন আপনি অ্যাক্সেস করেন, অবশ্যই এটি অবশ্যই তার পিতামাতার একটি "নিজস্ব সম্পত্তি" "" - পুনরায় পড়ুন

আরও বিশদ এখানে: 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 কল দ্বারা হ্যান্ডলবার্স টেমপ্লেটে ফিরে আসা বস্তুটি পাস করার আগে, আপনার .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;
    });

5

এনপিএম ইনস্টল হ্যান্ডেলবার সংস্করণ 4.5.3 ব্যবহার করে দেখুন

এনপিএম ইনস্টল হ্যান্ডেলবার্স @ ৪.৫.৩

এটা আমার জন্য কাজ করেছে


এটি একটি মন্তব্য হওয়া উচিত
অরুণ বিনোথ

আমি বর্তমানে এক্সপ্রেস-হ্যান্ডেলবারগুলি, সংস্করণ 3.1.0
লি বুন কং

ধন্যবাদ, আমি আপনার উভয় চেষ্টা করেছি এবং @ ম্যাসনের অ্যাঞ্জার কাজ করবে তবে আমি কেন জানি এটি নিশ্চিত নয়।
লি বুন কং

3

সংস্করণ ৪.6.০ থেকে শুরু করে, হ্যান্ডেলবার্স প্রোটোটাইপ বৈশিষ্ট্য এবং ডিফল্টরূপে প্রাসঙ্গিক অবজেক্টের পদ্ধতিগুলি অ্যাক্সেস করতে নিষেধ করেছেন। এটি এখানে বর্ণিত একটি সুরক্ষা সমস্যার সাথে সম্পর্কিত: https://mahmoudsec.blogspot.com/2019/04/handlebars-template-inication-and-rce.html

পড়ুন https://github.com/wycats/handlebars.js/issues/1642

আপনি যদি নিশ্চিত হন যে কেবল বিকাশকারীদের টেম্পলেটগুলিতে অ্যাক্সেস রয়েছে তবে নিম্নলিখিত প্যাকেজটি ইনস্টল করে প্রোটোটাইপ অ্যাক্সেসের অনুমতি দেওয়া সম্ভব:

npm i @handlebars/allow-prototype-access

আপনি যদি এক্সপ্রেস-হ্যান্ডেলবারগুলি ব্যবহার করে থাকেন তবে আপনার এই হিসাবে এগিয়ে যাওয়া উচিত:

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')

ধন্যবাদ এটি কাজ করেছে। সুতরাং আমাদের প্রতিবার যখন এক্সপ্রেস-হ্যান্ডেলবারগুলি ব্যবহার করতে হবে তখন তা করতে হবে?
যশ বউরা

2

হ্যান্ডলবার্সের সাম্প্রতিক প্রকাশে একটি ব্রেকিং পরিবর্তন হয়েছিল যা এই ত্রুটির কারণ হয়েছে।

আপনি তাদের ডকুমেন্টেশনে যে পরামর্শগুলি দিয়েছেন সেগুলি আপনি কেবল যুক্ত করতে পারেন, তবে আপনার প্রয়োগের উপর নির্ভর করে এটি এক্সএক্সএস এবং আরসিই আক্রমণে দুর্বলতার দিকে নিয়ে যেতে পারে।

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

আহ্ তাই সেখানে আমি বিকল্পগুলি যুক্ত করছি, অনেক অনেক ধন্যবাদ!
লি বুন কং

1
এটি আমার পক্ষে কাজ করে না। একটি কলব্যাক আশা করা হয়েছিল, কোনও বিকল্পের বস্তু নয়।
mrg95

0

ফিরিয়ে দেওয়া ডেটা থেকে অন্য নতুন অবজেক্ট বা অ্যারে তৈরি করা find() সমস্যার সমাধান করবে। নীচে একটি সাধারণ চিত্র দেখুন

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")
});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.