জাভাস্ক্রিপ্ট এর eval () কখনই খারাপ নয়?


263

আমি ব্যবহারকারী-প্রবেশ করা ফাংশন (স্প্রেডশিটের মতো কার্যকারিতার জন্য) পার্স করতে কিছু জাভাস্ক্রিপ্ট কোড লিখছি। সূত্র আমি পার্স রয়ে পারে এটা জাভাস্ক্রিপ্ট মধ্যে রূপান্তর এবং চালানোর eval()ফল করার জন্য এর উপরে।

তবে, আমি সর্বদা ব্যবহার থেকে বিরত eval()থাকি যদি আমি এটি এড়াতে পারি তবে এটি খারাপ (এবং, সঠিকভাবে বা ভুলভাবে, আমি সবসময়ই ভেবেছিলাম জাভাস্ক্রিপ্টে এটি আরও বেশি খারাপ, কারণ মূল্যায়নের কোডটি ব্যবহারকারীর দ্বারা পরিবর্তন করা যেতে পারে) )।

সুতরাং, যখন এটি ব্যবহার করা ঠিক আছে?


5
বেশিরভাগ জেএসওএন লাইব্রেরিগুলি প্রকৃতপক্ষে সুরক্ষা ঝুঁকি থেকে রক্ষা করার জন্য হুডের নীচে স্পষ্ট ব্যবহার করে না।
শন ম্যাকমিলান

11
@ শিয়ান - জিক্যুয়ারি এবং প্রোটোটাইপ উভয়ই ইওল ব্যবহার করুন (
জিকুয়ারি

5
@ প্লডডার - আপনি কোথায় আপনার তথ্য পাবেন? jQuery 1.4 সাল থেকে দেশীয় JSON.parse () ব্যবহার করেছে (1/2010-এ ফিরে আসবে)! নিজের জন্য দেখুন: কোড. jquery.com/jquery-1.4.js
কেন

3
"অবশ্যই জেএসএনকে পার্স করার জন্য একজনকে ইভাল () ব্যবহার করতে হবে" - এটি সত্য নয়, বিপরীতে - জেএসওনকে পার্স করার জন্য কারও পক্ষে ওয়াল ব্যবহার করা উচিত নয়! ব্যবহারের ডগলাস Crockfords '(তাদেরকে JSON স্রষ্টার) থেকে স্ক্রিপ্ট json2.js json.org !
টিএমএস

11
টমাস সেখানে বিদ্রূপ করছেন যে json2.js JSON কে পার্স করার জন্য ইওল ব্যবহার করে
tobyodavies

উত্তর:


262

আমি আপনার প্রশ্নের ভিত্তি মোকাবিলার জন্য কিছুটা সময় নিতে চাই - যেটি (") খারাপ "। প্রোগ্রামিং ভাষার লোকেরা ব্যবহৃত " দুষ্ট " শব্দের অর্থ সাধারণত "বিপজ্জনক" বা আরও স্পষ্টভাবে "সরল চেহারার কমান্ডের সাহায্যে প্রচুর ক্ষতি করতে সক্ষম" means সুতরাং, বিপজ্জনক কিছু ব্যবহার করা কখন ঠিক হবে? যখন আপনি জানবেন যে বিপদটি কী এবং কখন আপনি যথাযথ সতর্কতা অবলম্বন করছেন।

বিন্দুতে, আসুন ইওল () এর ব্যবহারের বিপদগুলি দেখুন। অন্য সব কিছুর মতোই সম্ভবত অনেকগুলি ছোট লুকানো বিপদ রয়েছে, তবে দুটি বড় ঝুঁকি - কারণ (alালকে) খারাপ বলে বিবেচনা করা হয় - সেগুলি হল পারফরম্যান্স এবং কোড ইঞ্জেকশন।

  • পারফরম্যান্স - ইভাল () দোভাষী / সংকলক চালায়। যদি আপনার কোডটি সংকলিত হয় তবে এটি একটি দুর্দান্ত হিট, কারণ রান-টাইমের মাঝামাঝি সময়ে আপনাকে সম্ভবত একটি ভারী ভারী সংকলক কল করতে হবে। যাইহোক, জাভাস্ক্রিপ্ট এখনও বেশিরভাগই একটি ব্যাখৃত ভাষা, যার অর্থ হ'ল সাধারন ক্ষেত্রে ইভাল () কল করা কোনও বড় পারফরম্যান্স নয় (তবে নীচে আমার নির্দিষ্ট মন্তব্য দেখুন)।
  • কোড ইনজেকশন - eval () সম্ভাব্যভাবে উন্নত সুবিধার অধীনে কোডের একটি স্ট্রিং চালায়। উদাহরণস্বরূপ, অ্যাডমিনিস্ট্রেটর / রুট হিসাবে চলমান একটি প্রোগ্রাম কখনই () ব্যবহারকারীর ইনপুটটি দেখতে চাইবে না, কারণ সেই ইনপুটটি সম্ভবত "আরএম-আরএফ / ইত্যাদি / গুরুত্বপূর্ণ-ফাইল" বা আরও খারাপ হতে পারে। আবার, ব্রাউজারে জাভাস্ক্রিপ্টের সমস্যা নেই, কারণ প্রোগ্রামটি যেভাবেই ব্যবহারকারীর নিজস্ব অ্যাকাউন্টে চলছে। সার্ভার-সাইড জাভাস্ক্রিপ্টটিতে এই সমস্যা থাকতে পারে।

আপনার নির্দিষ্ট ক্ষেত্রে। আমি যা বুঝতে পেরেছি সেগুলি থেকে আপনি নিজেই স্ট্রিংগুলি তৈরি করছেন, তাই ধরে নিচ্ছেন আপনি "আরএম-আরএফ-কিছু গুরুত্বপূর্ণ-জাতীয়" জাতীয় স্ট্রিং তৈরি না করার জন্য সতর্ক রয়েছেন, কোড ইঞ্জেকশনের ঝুঁকি নেই (তবে দয়া করে মনে রাখবেন, এটি খুব খুব সাধারণ ক্ষেত্রে এটি নিশ্চিত করা শক্ত )। এছাড়াও, আপনি যদি ব্রাউজারে চলছেন তবে কোড ইনজেকশনটি বেশ ছোটখাটো ঝুঁকিপূর্ণ, আমি বিশ্বাস করি।

পারফরম্যান্স হিসাবে, আপনার কোডিংয়ের স্বাচ্ছন্দ্যের তুলনায় ওজন করতে হবে। এটি আমার মতামত যে আপনি যদি সূত্রটি বিশ্লেষণ করছেন তবে পার্সের সময় আপনি অন্য পার্সার চালানোর পরিবর্তে ফলাফলটি গণনা করতে পারেন (এর মধ্যে একটিটি ইভাল ())। তবে ইভাল () ব্যবহার করে কোড করা সহজ হতে পারে এবং পারফরম্যান্স হিট সম্ভবত অদম্য হতে পারে। দেখে মনে হচ্ছে এভাল () এ ক্ষেত্রে অন্য কোনও ক্রিয়াকলাপের চেয়ে খারাপ আর কিছু নয় যা সম্ভবত আপনাকে কিছুটা সময় সাশ্রয় করতে পারে।


78
আপনি
কোডটির

48
কোড ইনজেকশন জাভাস্ক্রিপ্টের জন্য খুব গুরুতর সমস্যা যদি আপনি আপনার ব্যবহারকারীর ডেটা সম্পর্কে কিছুটা উদ্বিগ্ন হন। ইনজেক্টেড কোডটি চলবে (ব্রাউজারে) যেন এটি আপনার সাইট থেকে এসেছে, এটি যেকোন ধরণের শেনিনিগান করতে দিয়ে যা ব্যবহারকারী নিজেই করতে পারে। যদি আপনি (তৃতীয় পক্ষের) কোডটি আপনার পৃষ্ঠাতে প্রবেশ করার অনুমতি দেয় তবে এটি আপনার গ্রাহকের পক্ষে জিনিসগুলি অর্ডার করতে পারে বা তাদের গ্রাভাটার পরিবর্তন করতে পারে বা তারা আপনার সাইটের মাধ্যমে যা কিছু করতে পারে। খুব সতর্ক হও. হ্যাকারগুলিকে আপনার গ্রাহকদের মালিকানা দেওয়া ঠিক ততটা খারাপ কারণ সেগুলি আপনার সার্ভারের মালিকানাধীন।
শন ম্যাকমিলান

71
ডেটা যদি আপনার সার্ভার থেকে আসে এবং এটি, আপনি বিকাশকারী তৈরি করেছেন এমন কিছু থেকে থাকে তবে ইভাল () ব্যবহারের কোনও ক্ষতি নেই। আসল ক্ষতি হ'ল আপনার পড়া সমস্ত কিছু বিশ্বাস করা। আপনি দেখতে পাচ্ছেন যে প্রচুর লোকেরা এভাল () বলছে তা মন্দ এবং তারা কেন কোথাও এটি পড়ে তা ছাড়া তাদের কোনও ধারণা নেই।
ভিন্স পানুসিও

42
@ শিয়ান ম্যাকমিলান: আমি আপনাকে বিশ্বাস করতে চাই, তবে যদি কেউ eval()আপনার সার্ভার থেকে জাভাস্ক্রিপ্টটি বাধা এবং পরিবর্তন করতে চলেছে তবে তারা পৃষ্ঠার উত্সটি প্রথম স্থানে পরিবর্তন করতে এবং ব্যবহারকারীর তথ্যের নিয়ন্ত্রণও নিতে পারে। । । আমি পার্থক্যটি দেখতে পাচ্ছি না।
ওয়াল্ট ডব্লিউ

20
পুনরায় "কোড ইনজেকশন - ... আবার, ব্রাউজারে জাভাস্ক্রিপ্টের সমস্যা নেই," & "এছাড়াও, আপনি যদি ব্রাউজারে চালাচ্ছেন তবে কোড ইনজেকশনটি বেশ ছোটখাটো ঝুঁকি, আমি বিশ্বাস করি।" আপনি কি পরামর্শ দিচ্ছেন যে ব্রাউজারে কোড-ইনজেকশন কোনও সমস্যা নয়? এক্সএসএস বেশ কয়েক বছর ধরে চলমান OWASP এর শীর্ষ 10 তালিকার শীর্ষ 3 ভলনে রয়েছে।
মাইক স্যামুয়েল

72

eval()মন্দ নয়। বা যদি এটি হয় তবে এটি একইভাবে মন্দ যা একইভাবে প্রতিবিম্ব, ফাইল / নেটওয়ার্ক I / O, থ্রেডিং এবং আইপিসি অন্যান্য ভাষায় "দুষ্ট"।

যদি, আপনার উদ্দেশ্যে , eval()ম্যানুয়াল ব্যাখ্যার চেয়ে দ্রুত হয় বা আপনার কোডটিকে সহজতর করে তোলে বা আরও পরিষ্কার করে তোলে ... তবে আপনার এটি ব্যবহার করা উচিত। যদি না হয়, তবে আপনার উচিত হবে না। যে হিসাবে সহজ।


5
এরকম একটি উদ্দেশ্য হতে পারে অনুকূলিত কোড উত্পন্ন করা যা হাত দিয়ে লিখতে খুব দীর্ঘ বা খুব পুনরাবৃত্ত হবে। এলআইএসপিতে যে ধরণের স্টাফ ম্যাক্রোর জন্য ডাকবে।
ওয়াবেরি

5
এটি এমন একটি সাধারণ পরামর্শ যা এটি বিদ্যমান কোনও কোডের আক্ষরিক অর্থে প্রয়োগ করতে পারে। এটি সত্যই এই প্রশ্নের কিছু যোগ করে না; বিশেষত, এখানে আসা প্রত্যেককেই তাদের নির্দিষ্ট ব্যবহার সমস্যাযুক্ত কিনা তা নির্ধারণ করতে সহায়তা করে না।
jpmc26

2
দ্রুততর, সরল, আরও স্পষ্ট ... এই উত্তরটি সুরক্ষা সম্পর্কিত প্রভাবগুলিকে যথেষ্টভাবে কভার করে না।
রুড হেল্ডারম্যান

55

আপনি যখন উত্স বিশ্বাস।

জেএসএনের ক্ষেত্রে, উত্সটি নিয়ে টেম্পার করা কম-বেশি কঠিন, কারণ এটি আপনার নিয়ন্ত্রণাধীন একটি ওয়েব সার্ভার থেকে আসে। যতক্ষণ না জেএসএন নিজেই কোনও ব্যবহারকারী কোনও ডেটা আপলোড করে থাকে ততক্ষণ ইওল ব্যবহারের জন্য কোনও বড় ত্রুটি নেই।

অন্যান্য সমস্ত ক্ষেত্রে আমি সরবরাহকারী ডেটাগুলি বিধি খাওয়ানোর আগে খাওয়ানোর আগে আমার নিয়মগুলি মেনে চলে তা নিশ্চিত করার জন্য আমি অনেকদূর যেতে চাই।


13
একটি জসন স্ট্রিংটি সর্বদা জেসন ব্যাকরণের বিরুদ্ধে ইভিএল () এ ব্যবহার করার আগে পরীক্ষা করা উচিত। সুতরাং জাসন স্ট্রিং "SS foo: সতর্কতা ('এক্সএসএস')}" পাস করবে না যেহেতু "সতর্কতা ('এক্সএসএস')" সঠিক মান নয়।
গম্বো

3
ঠিক আছে, তবে HTTPS ব্যবহার করুন। ওটিওএইচ: বাগানের বিভিন্ন ওয়েব অ্যাপ্লিকেশনটির জন্য ম্যান-ইন-দ্য-মিডল সাধারণত আক্রমণাত্মক দৃশ্য নয়, যেখানে ক্রস-সাইট-স্ক্রিপ্টিং।
টমলাক

7
evalসমস্ত বৈধ JSON স্ট্রিং সঠিকভাবে পার্স করবে না। উদাহরণস্বরূপ JSON.parse(' "\u2028" ') === "\u2028"তবে eval(' "\u2028" ')একটি ব্যতিক্রম উত্থাপন করেছে কারণ জাভাস্ক্রিপ্টে ইউ +২২২৮ একটি নতুন লাইন তবে জেএসএন-র সম্পর্কিত এটি কোনও নতুন লাইন নয়।
মাইক স্যামুয়েল

1
@ জাস্টিন - যদি প্রোটোকলটি আপস করা হয় তবে ভাল, সাধারণত প্রাথমিক পৃষ্ঠা লোডটি একই প্রোটোকলের মাধ্যমে প্রেরণ করা হত, এবং তারপরে এটি একটি মূল বিন্দু কারণ ক্লায়েন্ট ইতিমধ্যে যতটা আপস করতে পারে ঠিক তেমন আপোস হতে পারে।
অ্যান্টিনোম

1
সুন্দরভাবে @ তোমালাক বলেছেন, আমি এখনই আমার উত্তরে এটি উল্লেখ করেছি! অসাধারণ!
নাইক নিউম্যান

25

আসুন আসল লোকেরা পান:

  1. প্রতিটি বড় ব্রাউজারে এখন অন্তর্নির্মিত কনসোল থাকে যা আপনার হ্যাকার যে কোনও মূল্যের সাথে কোনও ক্রিয়াকলাপ প্রার্থনা করতে প্রচুর পরিমাণে ব্যবহার করতে পারে - তারা কেন একটি স্পষ্ট বিবৃতি ব্যবহার করতে বিরক্ত করবে - এমনকি যদি তারা পারে?

  2. যদি জাভাস্ক্রিপ্টের 2000 লাইনের সংকলন করতে 0.2 সেকেন্ড সময় লাগে তবে আমি JSON এর চারটি লাইনটি ব্যাখ্যা করলে আমার পারফরম্যান্স অবনতি কী?

এমনকি ক্রোকফোর্ডের ব্যাখ্যা 'ইভালটি হ'ল দুষ্ট' weak

eval হল ইভিল, জাভাস্ক্রিপ্টের সবচেয়ে অপব্যবহারযোগ্য বৈশিষ্ট্য হল ইভাল ফাংশন। এটা এড়ানোর

যেহেতু ক্রোকফোর্ড নিজেই বলতে পারেন "এই ধরণের বক্তব্য অযৌক্তিক স্নায়ুতন্ত্র তৈরি করে it এটি কিনবেন না।"

ইওল বোঝা এবং এটি কখন কার্যকর হতে পারে তা বোঝা উপায় way উদাহরণস্বরূপ, ইভাল আপনার সফ্টওয়্যার দ্বারা উত্পন্ন সার্ভার প্রতিক্রিয়াগুলি মূল্যায়নের জন্য একটি বুদ্ধিমান সরঞ্জাম tool

বিটিডাব্লু: প্রোটোটাইপ.জেএস কলগুলি সরাসরি পাঁচ বার (ইভালজেএসএন () এবং ইভালরেস্পোনস () সহ কল ​​করে। jQuery পার্সজেএসএসনে এটি ব্যবহার করে (ফাংশন কনস্ট্রাক্টরের মাধ্যমে)।


10
জাফলি যদি উপলব্ধ থাকে তবে ব্রাউজারের অন্তর্নির্মিত JSON.parse ফাংশনটি ব্যবহার করে (যা আরও দ্রুত এবং সুরক্ষিত), কেবল ফলব্যাক প্রক্রিয়া হিসাবে ইওল ব্যবহার করে। "এভাল অশুভ" বিবৃতিটি একটি যুক্তিসঙ্গতভাবে ভাল নির্দেশিকা।
jjmontes

30
পুনরায় "প্রতিটি বড় ব্রাউজারে এখন কনসোল অন্তর্নির্মিত থাকে ..."। কোড ইঞ্জেকশন এমন সমস্যা হয় যখন কোনও ব্যবহারকারী কোড প্রবেশ করতে পারে যা অন্য ব্যবহারকারীর ব্রাউজারে চালিত হয়। ব্রাউজার কনসোলগুলি নিজেই একজন ব্যবহারকারীকে অন্য ব্যবহারকারীদের ব্রাউজারে কোড চালানোর অনুমতি দেয় না তাই কোড ইঞ্জেকশন থেকে রক্ষা করার উপযুক্ত কিনা তা সিদ্ধান্ত নেওয়ার ক্ষেত্রে তারা অপ্রাসঙ্গিক।
মাইক স্যামুয়েল

28
"প্রতিটি বড় ব্রাউজারে এখন কনসোল অন্তর্নির্মিত থাকে ... তারা কেন স্পষ্ট বিবৃতি ব্যবহার করতে বিরক্ত করবে?" - তুমি দুরে ছিলে না। আমি আপনাকে উত্তর সম্পাদনা করার পরামর্শ দিচ্ছি। অন্য ব্যবহারকারীর ব্রাউজারে চলতে পারে এমন একটি কোড ইনজেকশনের দক্ষতা একটি বড় সমস্যা। এবং এখানেই আপনার সত্যিকারের বাস্তব হওয়া দরকার।
আক্কিশোর

5
@ ককিশোর, আপনি যদি এমন বাস্তব জীবনের উদাহরণ নিয়ে উপস্থিত হন যা আপনার বিবৃত বক্তব্যগুলিকে সমর্থন করে তবে আমি প্রশংসা করব
আকাশ কাভা

7
@ আকাশকাভা আপনি যেটি বুঝতে ব্যর্থ হচ্ছেন তা হ'ল যদি আমি আমার মন্তব্য বাক্সে জাভাস্ক্রিপ্ট জমা করি এবং সেই জাভাস্ক্রিপ্টটি এটি ডেটাবেসে পরিণত করে। যখন অন্য কোনও ব্যবহারকারী সেই মন্তব্য দেখে (যে আমি জাভাস্ক্রিপ্টটি এতে রেখেছি), ইভাল যখন এটি রেন্ডার করা হবে তখন সেই জাভাস্ক্রিপ্টটি গ্রহণ করবে এবং দোভাষী ব্যবহার করে এটি মূল্যায়ন করবে, যার ফলে আমার এম্বেড করা জাভাস্ক্রিপ্টটিকে অন্য ব্যবহারকারীর ব্রাউজারে কার্যকর করা হবে। এটি করে, আমি সমস্ত ধরণের তথ্য গ্রিন করতে পারি। তাদের ব্যবহারকারীর নাম, ডাটাবেসে তাদের ব্যবহারকারীর আইডি, তাদের ই-মেইল ঠিকানা ইত্যাদি answer এটি কোনও কঠিন উত্তর নয়, যদি আপনি গুগলড এক্সএস করেন, আপনি কেন এটি সমস্যা তা প্রায় 10 সেকেন্ডে দেখতে পাবেন।
কাইল রিখটার

18

আমি অনুসরণ করে Crockford পরামর্শ জন্য eval(), এবং এটি পুরাপুরি এড়ানো। এমনকি এটি যেভাবে দেখা প্রয়োজন এটিগুলিও এটি করে না। উদাহরণস্বরূপ, setTimeout()অনুমতিগুলি আপনাকে স্পষ্ট না করে কোনও ফাংশন পাস করার অনুমতি দেয়।

setTimeout(function() {
  alert('hi');
}, 1000);

এমনকি এটি কোনও বিশ্বস্ত উত্স হলেও, আমি এটি ব্যবহার করি না, কারণ জেএসওনের দ্বারা ফিরিয়ে দেওয়া কোডটি গার্ফড হয়ে থাকতে পারে যা সবচেয়ে খারাপভাবে খারাপ কিছু প্রকাশ করতে পারে।


2
আমি মনে করি সার্ভারের পাশের JSON ফর্ম্যাটারে বাগগুলি অবশ্যই একটি সমস্যা। সার্ভারের প্রতিক্রিয়া কি কোনও ধরণের ব্যবহারকারী জমা দেওয়া পাঠ্যের উপর নির্ভর করে? তারপরে আপনি এক্সএসএসের জন্য নজর রাখবেন।
সুইলিয়ামস

3
যদি আপনার ওয়েবসভারটি এইচটিটিপিএসের মাধ্যমে প্রমাণীকৃত না হয়, তবে আপনি মাঝারি ধরনের আক্রমণে ভুগতে পারেন যেখানে অন্য হোস্ট অনুরোধটিকে বাধা দেয় এবং তার নিজস্ব ডেটা প্রেরণ করে।
বেন Combee

11
যদি কেউ মধ্যবর্তী আক্রমণে ম্যান-ইন-পারফরম্যান্স করতে পারে তবে সে সহজেই আপনার স্ক্রিপ্টগুলিতে কোনও কিছু ইনজেক্ট করতে পারে।
el.pescado

10
আপনার জাভাস্ক্রিপ্ট কোডটিতে একেবারেই ভরসা করা উচিত নয় ... আপনি ক্লায়েন্টের পক্ষে চলমান কোনও কিছুর উপর নির্ভর করবেন না ... যদি কেউ মাঝারি-মধ্যবর্তী আক্রমণ করে তবে সে আপনার জেসন বস্তুগুলির সাথে কেন ঝামেলা করবে? তিনি আপনাকে এবং বিভিন্ন
জেএস

5
আমি ব্যক্তিগতভাবে এই যুক্তিটি অপছন্দ করি "এটি করার অন্যান্য উপায় সর্বদা আছে।" উদাহরণস্বরূপ, আপনি এটিও বলতে পারেন যে সবসময় অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং এড়ানোর উপায় রয়েছে। এর অর্থ এই নয় যে এটি দুর্দান্ত বিকল্প নয়। যদি আপনি বুঝতে পারা এবং এটির বিপদগুলি হয় তবে সঠিক পরিস্থিতিতে এটি ব্যবহারের দুর্দান্ত সরঞ্জাম হতে পারে।
ডালিন

4

আমি লোককে ওয়াল ব্যবহার না করার পক্ষে পরামর্শ দিয়েছিলাম, কারণ এটি মন্দ , কিন্তু আমি একই লোকগুলিকে গতিশীলভাবে ফাংশন এবং সেটটাইমআউট ব্যবহার করতে দেখেছি, তাই তারা ফণা নীচে ইওল ব্যবহার করে : ডি

বিটিডাব্লু, যদি আপনার স্যান্ডবক্সটি পর্যাপ্ত পরিমাণে নিশ্চিত না হয় (উদাহরণস্বরূপ, আপনি যদি এমন কোনও সাইটে কাজ করছেন যা কোড ইনজেকশনের অনুমতি দেয়) আপনার সমস্যাগুলির মধ্যে সর্বশেষ। নিরাপত্তা মৌলিক নিয়ম যে সব ইনপুট মন্দ, কিন্তু এর জাভাস্ক্রিপ্ট ক্ষেত্রে এমনকি জাভাস্ক্রিপ্ট নিজেই, মন্দ হতে পারে কারণ জাভাস্ক্রিপ্ট মধ্যে যদি আপনি কোন ফাংশন ওভাররাইট করতে পারেন এবং আপনি ঠিক নিশ্চিত আপনি বাস্তব ব্যবহার করছেন হতে পারে না, তাই হয়, যদি আপনার আগে কোনও দূষিত কোড শুরু হয় তবে আপনি কোনও জাভাস্ক্রিপ্ট অন্তর্নির্মিত ফাংশনটিতে বিশ্বাস করতে পারবেন না: ডি

এখন এই পোস্টের পর্বটি হ'ল:

আপনার যদি সত্যিই এটির প্রয়োজন হয় (সময়ের ev০% সময়ের প্রয়োজন হয় না ) এবং আপনি কী করছেন সে সম্পর্কে আপনি নিশ্চিত, কেবল ইওল (বা আরও ভাল ফাংশন;) ব্যবহার করুন, ক্লোজার এবং ওওপি 80/90% এর কভার করে অন্যরকম যুক্তি ব্যবহার করে যেখানে eval প্রতিস্থাপন করা যায়, বাকীটি গতিশীলভাবে কোড উত্পন্ন হয় (উদাহরণস্বরূপ, আপনি যদি দোভাষী লিখছেন) এবং যেমন আপনি ইতিমধ্যে জেএসএনকে মূল্যায়ন করেছেন বলেছিলেন (এখানে আপনি ক্রকফোর্ড নিরাপদ মূল্যায়ন ব্যবহার করতে পারেন;))


এবং ক্রকফোর্ড নিজেই উল্লেখ করেছেন , বর্তমান ওয়েব ব্রাউজারগুলিতে একটি অন্তর্নির্মিত ফাংশন রয়েছে JSON.parse
রুড হেল্ডারম্যান

4

ইভাল সংকলনের পরিপূরক যা কোড টেম্প্লেটিংয়ে ব্যবহৃত হয়। টেম্পলেট করে আমি বলতে চাইছি আপনি একটি সরলীকৃত টেম্পলেট জেনারেটর লিখুন যা দরকারী টেম্পলেট কোড তৈরি করে যা উন্নয়নের গতি বাড়িয়ে তোলে।

আমি একটি ফ্রেমওয়ার্ক লিখেছি, যেখানে বিকাশকারীরা ইভাল ব্যবহার করে না, তবে তারা আমাদের কাঠামো ব্যবহার করে এবং পরিবর্তে টেমপ্লেট উত্পন্ন করতে ফ্রেমওয়ার্কটি ইভিএল ব্যবহার করতে হয়।

নীচের পদ্ধতিটি ব্যবহার করে EVAL এর কার্যকারিতা বাড়ানো যেতে পারে; স্ক্রিপ্টটি কার্যকর করার পরিবর্তে আপনাকে অবশ্যই একটি ফাংশন ফিরিয়ে দিতে হবে।

var a = eval("3 + 5");

এটি হিসাবে সংগঠিত করা উচিত

var f = eval("(function(a,b) { return a + b; })");

var a = f(3,5);

ক্যাচিং এফ অবশ্যই স্পিডের উন্নতি করবে।

এছাড়াও ক্রোম খুব সহজেই এই জাতীয় ফাংশনগুলি ডিবাগ করার অনুমতি দেয়।

সুরক্ষা সম্পর্কিত, ইওল ব্যবহার করা বা না করা খুব কমই কোনও পার্থক্য তৈরি করবে,

  1. প্রথমত, ব্রাউজারটি একটি স্যান্ডবক্সে পুরো স্ক্রিপ্টটি আহ্বান করে।
  2. যে কোনও কোড যা এভাল-এ খারাপ, তা ব্রাউজারেই খারাপ। হামলাকারী বা যে কেউ সহজেই ডিওমে একটি স্ক্রিপ্ট নোড ইনজেক্ট করতে পারে এবং সে / যদি সে কিছু আবিষ্কার করতে পারে তবে কিছু করতে পারে। ইভাল ব্যবহার না করা কোনও পার্থক্য তৈরি করবে না।
  3. এটি বেশিরভাগ দুর্বল সার্ভার-সাইড সুরক্ষা যা ক্ষতিকারক। দুর্বল কুকিজের বৈধতা বা সার্ভারে দুর্বল এসিএল প্রয়োগ বেশিরভাগ আক্রমণের কারণ।
  4. জাভার স্থানীয় কোডে একটি সাম্প্রতিক জাভা দুর্বলতা ইত্যাদি ছিল। জাভাস্ক্রিপ্টটি স্যান্ডবক্সে চালানোর জন্য তৈরি করা হয়েছিল এবং এটি অ্যাপলেটগুলি স্যান্ডবক্সের বাইরে শংসাপত্র ইত্যাদির বাইরে চালানোর জন্য ডিজাইন করা হয়েছিল যা দুর্বলতা এবং অন্যান্য অনেক কিছুর দিকে পরিচালিত করে।
  5. ব্রাউজারের অনুকরণের জন্য কোড লেখা কঠিন নয়। আপনাকে যা করতে হবে তা হ'ল আপনার পছন্দসই ব্যবহারকারীর এজেন্ট স্ট্রিং সহ সার্ভারে একটি HTTP অনুরোধ করা। সমস্ত পরীক্ষার সরঞ্জামগুলি ব্রক ব্রাউজারগুলিকে যাই হোক না কেন; যদি কোনও আক্রমণকারী আপনাকে ক্ষতি করতে চায় তবে EVAL হ'ল তাদের শেষ অবলম্বন। আপনার সার্ভার-সাইড সুরক্ষা মোকাবেলায় তাদের আরও অনেক উপায় রয়েছে।
  6. ব্রাউজার ডিওএম-তে ফাইলের অ্যাক্সেস নেই এবং ব্যবহারকারীর নাম নেই। প্রকৃতপক্ষে মেশিনে এমন কোনও কিছুই অ্যাক্সেস দিতে পারে না।

যদি আপনার সার্ভার-সাইড সুরক্ষা যেকোন স্থান থেকে যে কেউ আক্রমণ করার পক্ষে যথেষ্ট দৃ ,় হয় তবে আপনাকে ইভাল সম্পর্কে চিন্তা করা উচিত নয়। যেমনটি আমি উল্লেখ করেছি, যদি EVAL এর অস্তিত্ব না থাকে তবে আক্রমণকারীদের আপনার ব্রাউজারের EVAL ক্ষমতা নির্বিশেষে আপনার সার্ভারে হ্যাক করার জন্য অনেকগুলি সরঞ্জাম রয়েছে।

অগ্রিম ব্যবহৃত হয়নি এমন কোনও ভিত্তিতে জটিল স্ট্রিং প্রসেসিং করতে কিছু টেম্পলেট তৈরি করার জন্য ইভাল কেবল ভাল। উদাহরণস্বরূপ, আমি পছন্দ করব

"FirstName + ' ' + LastName"

উল্টোদিকে

"LastName + ' ' + FirstName"

আমার প্রদর্শনের নাম হিসাবে, যা কোনও ডাটাবেস থেকে আসতে পারে এবং যা হার্ডকড হয় না।


আপনি eval - এর পরিবর্তে ফাংশনটি ব্যবহার করতে পারেন function (first, last) { return last + ' ' + first }
কনরাড বোরোস্কি

কলামগুলির নাম ডাটাবেস থেকে আসে।
আকাশ কাওয়া

3
এর হুমকি evalবেশিরভাগ অন্যান্য ব্যবহারকারীদের । ধরা যাক আপনার একটি সেটিংস পৃষ্ঠা রয়েছে এবং এটি আপনাকে অন্যের কাছে কীভাবে প্রদর্শিত হবে তা সেট করতে দেয়। আসুন আমরা এটাও বলি যে আপনি এটি লেখার সময় খুব স্পষ্টভাবে চিন্তা করেননি, তাই আপনার নির্বাচিত বাক্সে পছন্দ মতো বিকল্প রয়েছে <option value="LastName + ' ' + FirstName">Last First</option>। আমি আমার ডিভাইসগুলি খুলি value, কোনও বিকল্পের alert('PWNED!')পরিবর্তনে, পরিবর্তিত বিকল্পটি নির্বাচন করে ফর্মটি জমা দিতে পারি submit এখন, অন্য যে কোনও সময় আমার প্রদর্শনের নাম দেখতে পাবে, সেই কোডটি চলে।
সিএওও

@ সিএইচও, আপনি যেটির বিষয়ে কথা বলছেন সেটি হ'ল দুর্বল সার্ভার সাইড সুরক্ষার উদাহরণ, সার্ভারটি এমন ডেটা কখনই গ্রহণ করা উচিত নয় যা কারও ব্রাউজারে কোড হিসাবে কার্যকর করা যায়। আবারও, আপনি দুর্বল সার্ভার সাইড সুরক্ষা ধারণাটি বুঝতে ব্যর্থ হয়েছেন।
আকাশ কাভা

1
আপনি যদি চান তবে আপনি সার্ভার-সাইড সুরক্ষা সম্পর্কে ঝকঝকে করতে পারেন, তবে এর পুরো বিষয়টি evalহ'ল কোডটি চালানো যা আপনার লিখিত স্ক্রিপ্টের অংশ নয়। আপনার যদি এটি করার শক্তিটির প্রয়োজন না হয় (এবং আপনি প্রায়শই কখনও করেন না), এড়ানো এড়ানো evalএকটি সম্পূর্ণ বিভাগের সমস্যার সমাধান করতে সহায়তা করে। আপনার সার্ভার-সাইড কোডটি পারফেক্টের চেয়ে কম হলে এটি একটি ভাল জিনিস।
সিএওও

4

ক্রোম (v28.0.1500.72) এ ডিবাগ করার সময়, আমি দেখতে পেয়েছি যে ভেরিয়েবলগুলি ক্লোজড তৈরি করতে বাধ্য হয় না যদি তারা কোনও নেস্টেড ফাংশনে ব্যবহার না করে যা বন্ধ করে। আমার ধারণা, এটি জাভাস্ক্রিপ্ট ইঞ্জিনের একটি অপ্টিমাইজেশন।

বাট : যখন eval()কোনও ফাংশনের অভ্যন্তরে ব্যবহৃত হয় যা বন্ধ হওয়ার কারণ হয়ে থাকে, বাইরের ফাংশনের সমস্ত ভেরিয়েবলগুলি বন্ধ করার জন্য আবদ্ধ থাকে, এমনকি যদি সেগুলি ব্যবহার না করা হয়। কারও কাছে যদি টেস্ট করার সময় থাকে যে এটি দ্বারা মেমরি ফাঁস তৈরি করা যায় তবে দয়া করে নীচে আমাকে একটি মন্তব্য দিন।

আমার পরীক্ষার কোডটি এখানে:

(function () {
    var eval = function (arg) {
    };

    function evalTest() {
        var used = "used";
        var unused = "not used";

        (function () {
            used.toString();   // Variable "unused" is visible in debugger
            eval("1");
        })();
    }

    evalTest();
})();

(function () {
    var eval = function (arg) {
    };

    function evalTest() {
        var used = "used";
        var unused = "not used";

        (function () {
            used.toString();   // Variable "unused" is NOT visible in debugger
            var noval = eval;
            noval("1");
        })();
    }

    evalTest();
})();

(function () {
    var noval = function (arg) {
    };

    function evalTest() {
        var used = "used";
        var unused = "not used";

        (function () {
            used.toString();    // Variable "unused" is NOT visible in debugger
            noval("1");
        })();
    }

    evalTest();
})();

আমি এখানে যে বিষয়টি উল্লেখ করতে চাই তা হ'ল, evভালটি () অবশ্যই দেশীয় eval()ফাংশনকে বোঝায় না । এটি সমস্ত ফাংশনের নামের উপর নির্ভর করে । সুতরাং eval()নেটিভকে একটি উপনামের নাম দিয়ে বলার var noval = eval;পরে (বলুন এবং তারপরে কোনও অভ্যন্তরীণ ফাংশনে noval(expression);) তখন মূল্যায়ন expressionব্যর্থ হতে পারে যখন এটি ভেরিয়েবলগুলি বোঝায় যা বন্ধের অংশ হওয়া উচিত, তবে আসলে তা নয়।


3

মাইক্রোসফ্ট ব্যাখ্যা করে যে কেন আইওয়াল ব্লগ, আই + + জাভাস্ক্রিপ্ট পারফরম্যান্সের প্রস্তাবনাগুলি পার্ট 2: জাভাস্ক্রিপ্ট কোড অপ্রতুলতাগুলিতে তাদের ব্রাউজারে ইভাল () ধীর গতিতে রয়েছে ।


3

শেষের সারি

আপনি যদি কোডটি তৈরি করেন বা স্যানিটাইজ করেন evalতবে এটি কখনই মন্দ নয়

সামান্য আরও বিশদ

evalহয় মন্দ যদি সার্ভার একটি ক্লায়েন্ট ছিল দ্বারা জমা ইনপুট ব্যবহার করে চলমান ডেভেলপার দ্বারা তৈরি করা বা যে ছিল ডেভেলপার দ্বারা sanitized না

evalহয় মন্দ নয় যদি, ক্লায়েন্ট চলমান এমনকি যদি ক্লায়েন্ট দ্বারা crafted unsanitized ইনপুট ব্যবহার করে

স্পষ্টতই আপনার ইনপুটটি সর্বদা স্যানিটাইজ করা উচিত , যাতে আপনার কোড কী খায় তার উপর কিছু নিয়ন্ত্রণ থাকে।

যুক্তি

বিকাশকারী কোডটি না দিয়ে থাকলেও ক্লায়েন্ট তাদের যে কোনও স্বেচ্ছাসেবী কোড চালাতে পারে; এটি শুধুমাত্র জন্য সত্য কি evaled করা হয়, কিন্তু কল evalনিজেই


2

আপনি যখন উড়ালটিতে গতিশীল জেএস চালানোর প্রয়োজন হয় তখনই আপনাকে ইয়াল () ব্যবহার করা উচিত। আমি জেএস সম্পর্কে বলছি যে আপনি সার্ভার থেকে অবিচ্ছিন্নভাবে ডাউনলোড করেছেন ...

... এবং 10 এর 9 বার আপনি সহজেই রিফ্যাক্টরিং করে তা করা এড়াতে পারেন।



1

evalখুব কমই সঠিক পছন্দ। যদিও এমন অনেকগুলি উদাহরণ থাকতে পারে যেখানে আপনি কোনও স্ক্রিপ্ট একসাথে জড়ো করে এবং ফ্লাইতে চালিয়ে আপনি যা অর্জন করতে হবে তা অর্জন করতে পারেন, তবে আপনার সাধারণত আপনার নিষ্পত্তি করার ক্ষেত্রে আরও অনেক শক্তিশালী এবং রক্ষণাবেক্ষণের কৌশল রয়েছে: এসোসিয়েটিভ-অ্যারে নোটেশন ( obj["prop"]একইরকম obj.prop) , ক্লোজার, অবজেক্ট-ওরিয়েন্টেড কৌশল, ক্রিয়ামূলক কৌশল - পরিবর্তে সেগুলি ব্যবহার করুন।


1

ক্লায়েন্ট স্ক্রিপ্ট যতদূর যায়, আমি মনে করি সুরক্ষার বিষয়টি একটি মূল বিষয় oot ব্রাউজারে লোড করা সমস্ত কিছুই ম্যানিপুলেশন সাপেক্ষে এবং সেই হিসাবে আচরণ করা উচিত। আপনার ব্রাউজারে ইউআরএল বারের মতো জাভাস্ক্রিপ্ট কোড এবং / অথবা ডিওমে অবজেক্টগুলি ম্যানিপুলেট করার জন্য খুব সহজ উপায় রয়েছে যখন ইওল () বিবৃতিটি ব্যবহার করার শঙ্কা থাকে।

javascript:alert("hello");

যদি কেউ তাদের ডিওএম চালনা করতে চায় তবে আমি বলি যে সেগুলি দূরে সরে যাবে। কোনও ধরণের আক্রমণ প্রতিরোধের সুরক্ষা সর্বদা সার্ভার অ্যাপ্লিকেশন, পিরিয়ডের দায়িত্ব হওয়া উচিত।

বাস্তববাদী দৃষ্টিকোণ থেকে, পরিস্থিতি অন্যথায় করা যেতে পারে এমন পরিস্থিতিতে ইভাল () ব্যবহার করার কোনও সুবিধা নেই। যাইহোক, নির্দিষ্ট ক্ষেত্রে রয়েছে যেখানে একটি খোলামেলা ব্যবহার করা উচিত। যখন এটি হয়, পৃষ্ঠাটি ফুটিয়ে তোলার কোনও ঝুঁকি ছাড়াই এটি অবশ্যই করা যেতে পারে।

<html>
    <body>
        <textarea id="output"></textarea><br/>
        <input type="text" id="input" />
        <button id="button" onclick="execute()">eval</button>

        <script type="text/javascript">
            var execute = function(){
                var inputEl = document.getElementById('input');
                var toEval = inputEl.value;
                var outputEl = document.getElementById('output');
                var output = "";

                try {
                    output = eval(toEval);
                }
                catch(err){
                    for(var key in err){
                        output += key + ": " + err[key] + "\r\n";
                    }
                }
                outputEl.value = output;
            }
        </script>
    <body>
</html>

6
পুনরায় "জাভাস্ক্রিপ্ট কার্যকর করার জন্য এবং / অথবা ডিওমে অবজেক্টগুলিকে ম্যানিপুলেট করার জন্য খুব সহজ উপায় থাকলে ইওল () বিবৃতিটি ব্যবহার করার শঙ্কা রয়েছে" is কোড ইঞ্জেকশন এমন সমস্যা হয় যখন কোনও ব্যবহারকারী কোড প্রবেশ করতে পারে যা অন্য ব্যবহারকারীর ব্রাউজারে চালিত হয়। ব্রাউজার কনসোলগুলি নিজেই একজন ব্যবহারকারীকে অন্য ব্যবহারকারীদের ব্রাউজারে কোড চালানোর অনুমতি দেয় না তাই কোড ইঞ্জেকশন থেকে রক্ষা করার উপযুক্ত কিনা তা সিদ্ধান্ত নেওয়ার ক্ষেত্রে তারা অপ্রাসঙ্গিক।
মাইক স্যামুয়েল

নয় <head></head>প্রয়োজন, এমনকি খালি তাহলে কি হবে?
পিটার মর্টেনসেন

2
এই উত্তরটি এক্সএসএসের ঝুঁকিকে সম্পূর্ণ উপেক্ষা করে ।
রুড হেল্ডারম্যান

1

যেমন এসকিএল বা ইনফ্লক্সডিবি বা মঙ্গোর মতো বাহ্যিক স্ক্রিপ্টগুলি নিয়ে কাজ করার সময় সার্ভারের দিকে ইয়াল কার্যকর হয়। যেখানে রানটাইমের সময় কাস্টম বৈধতা আপনার পরিষেবাদি পুনরায় স্থাপন না করে তৈরি করা যায়।

উদাহরণস্বরূপ নিম্নলিখিত মেটাডেটা সহ একটি কৃতিত্ব পরিষেবা

{
  "568ff113-abcd-f123-84c5-871fe2007cf0": {
    "msg_enum": "quest/registration",
    "timely": "all_times",
    "scope": [
      "quest/daily-active"
    ],
    "query": "`SELECT COUNT(point) AS valid from \"${userId}/dump/quest/daily-active\" LIMIT 1`",
    "validator": "valid > 0",
    "reward_external": "ewallet",
    "reward_external_payload": "`{\"token\": \"${token}\", \"userId\": \"${userId}\", \"amountIn\": 1, \"conversionType\": \"quest/registration:silver\", \"exchangeProvider\":\"provider/achievement\",\"exchangeType\":\"payment/quest/registration\"}`"
  },
  "efdfb506-1234-abcd-9d4a-7d624c564332": {
    "msg_enum": "quest/daily-active",
    "timely": "daily",
    "scope": [
      "quest/daily-active"
    ],
    "query": "`SELECT COUNT(point) AS valid from \"${userId}/dump/quest/daily-active\" WHERE time >= '${today}' ${ENV.DAILY_OFFSET} LIMIT 1`",
    "validator": "valid > 0",
    "reward_external": "ewallet",
    "reward_external_payload": "`{\"token\": \"${token}\", \"userId\": \"${userId}\", \"amountIn\": 1, \"conversionType\": \"quest/daily-active:silver\", \"exchangeProvider\":\"provider/achievement\",\"exchangeType\":\"payment/quest/daily-active\"}`"
  }
}

যা তখন অনুমতি দেয়,

  • একটি জেসনে আক্ষরিক স্ট্রিংয়ের মাধ্যমে অবজেক্ট / মানগুলির সরাসরি ইনজেকশন, পাঠ্য টেম্প্লেটিংয়ের জন্য দরকারী

  • তুলনাকারী হিসাবে ব্যবহার করা যেতে পারে, বলুন আমরা কীভাবে সিএমএসে কোয়েস্ট বা ইভেন্টগুলিকে বৈধতা দিতে পারি তার বিধি তৈরি করি

এর কন:

  • পুরোপুরি পরীক্ষিত না হলে কোডে ত্রুটি হতে পারে এবং পরিষেবাতে জিনিসগুলি ভেঙে দেওয়া যেতে পারে।

  • যদি কোনও হ্যাকার আপনার সিস্টেমে স্ক্রিপ্ট লিখতে পারে তবে আপনি বেশ খারাপ sc

  • আপনার স্ক্রিপ্টের বৈধতা দেওয়ার একটি উপায় হ'ল আপনার স্ক্রিপ্টগুলির হ্যাশ কোথাও নিরাপদ রাখা, যাতে আপনি চালনার আগে সেগুলি পরীক্ষা করতে পারেন।


খুশী হলাম। আমি যখন প্রশ্নটি জিজ্ঞাসা করেছি তখন আমি সার্ভার-সাইড জেএস সম্পর্কেও ভাবিনি।
রিচার্ড টার্নার

1

আমি মনে করি যে ন্যায়সঙ্গত প্রমাণিত হওয়ার কোনও ঘটনা বিরল হবে। আপনি আরও এটা চিন্তা এটা সমর্থনযোগ্য যে আপনি এটি ব্যবহার করতে হলে এর ব্যবহার করার সম্ভাবনা বেশি করছি আসলে সমর্থনযোগ্য।

সুরক্ষা সংক্রান্ত সমস্যাগুলি সর্বাধিক পরিচিত। তবে এও সচেতন থাকুন যে জাভাস্ক্রিপ্টটি জেআইটি সংকলন ব্যবহার করে এবং এটি খুব খারাপভাবে ইওলির সাথে কাজ করে। ইভাল কিছুটা সংকলকের ব্ল্যাকবক্সের মতো, এবং জাভাস্ক্রিপ্টটি পারফরম্যান্স অপটিমাইজেশন এবং স্কোপিং নিরাপদে এবং সঠিকভাবে প্রয়োগ করার জন্য সময়ের (কিছুটা হলেও) আগে কোডের পূর্বাভাস দিতে সক্ষম হওয়া দরকার। কিছু ক্ষেত্রে, পারফরম্যান্সের প্রভাব এমনকি বাইরের অন্যান্য কোডকেও প্রভাবিত করতে পারে।

আপনি যদি আরও জানতে চান: https://github.com/getify/ You-Dont-Know-JS / blob / master / scope%20%26%20closures / ch2.md#eval


0

যদি evalফাংশনে পাস করা কোডটির উপরে আপনার সম্পূর্ণ নিয়ন্ত্রণ থাকে তবে এটি ব্যবহার করা ঠিক আছে ।


2
আপনি যা যাচ্ছেন তাতে যদি আপনার সম্পূর্ণ নিয়ন্ত্রণ থাকে eval, তবে বড় প্রশ্নটি হয়ে ওঠে, কখন আসল জেএসের চেয়ে স্ট্রিং হওয়ার পক্ষে এটি বোধগম্য হয়?
সিএওও

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

@ সামিফক্স আরও কিছু করার (এবং আরও ভাল) উপায় রয়েছে, উল্লেখযোগ্যভাবে <script async="true" src="...">। আরও দেখুন: w3bit.com/async- জাভাস্ক্রিপ্ট
রুড হেল্ডারম্যান

উত্তরটি বিপজ্জনক পরামর্শ; অনেকগুলি বিকাশকারীদের নিয়ন্ত্রণে থাকার ভ্রান্ত ধারণা রয়েছে। পরামর্শটি এমন সফ্টওয়্যারটির জন্য কিছুটা অর্থপূর্ণ করে তোলে যা সক্রিয়ভাবে রক্ষণাবেক্ষণ করা হয় না। তবে এই জাতীয় সফটওয়্যারকে মৃত হিসাবে বিবেচনা করা উচিত।
রুড হেল্ডারম্যান

0

সম্ভব হলে শুধুমাত্র পরীক্ষার সময়। এছাড়াও নোট করুন যে অন্যান্য বিশেষীকৃত জেএসওএন ইত্যাদি মূল্যায়নকারীদের তুলনায় ইভাল () অনেক ধীর।


0

যতক্ষণ না আপনি নিশ্চিত হতে পারেন যে কোডের উত্সটি আপনার বা প্রকৃত ব্যবহারকারীর কাছ থেকে এসেছে তা আপনি ইলাল () ব্যবহার না করার কোনও কারণ নেই। যদিও তিনি ইভাল () ফাংশনে কী পাঠিয়েছে তা কাজে লাগাতে পারেন, এটি কোনও সুরক্ষা সমস্যা নয়, কারণ তিনি ওয়েব সাইটের উত্স কোডটি পরিচালনা করতে সক্ষম হন এবং তাই নিজেই জাভাস্ক্রিপ্ট কোডটি পরিবর্তন করতে পারেন।

তো ... কখন ইওল () ব্যবহার করবেন না? তৃতীয় পক্ষ এটি পরিবর্তন করতে পারে এমন সম্ভাবনা রয়েছে কেবল তখনই ইভাল () ব্যবহার করা উচিত নয়। ক্লায়েন্ট এবং আপনার সার্ভারের মধ্যে সংযোগকে বাধা দেওয়ার মতো (তবে এটি যদি সমস্যা হয় তবে এইচটিটিপিএস ব্যবহার করুন)। ফোরামের মতো অন্যেরা লিখেছেন এমন পার্সিং কোডের জন্য আপনার () বিভক্ত হওয়া উচিত নয়।


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

@ মাইকসামুয়েল, ইভাল অন্যান্য ব্যবহারকারীর ব্রাউজারে কোড কার্যকর করতে পারে, আমি এটি শুনে নি, আপনি কি এটি চেষ্টা করেছেন? ব্রাউজিংয়ের ইতিহাসে এটি কখনও ঘটেনি, আপনি কি আমাদের একটি উদাহরণ দেখাতে পারেন?
আকাশ কাভা

@ আকাশকাভা, একটি স্ট্রিং এক ব্যবহারকারী-এজেন্টের সাথে উত্পন্ন হতে পারে, একটি ডাটাবেসে সংরক্ষণ করা যায় এবং তারপরে evalএটি অন্য ব্রাউজারে পরিবেশন করা যেতে পারে। এটা সব সময় এরকম ঘটে.
মাইক স্যামুয়েল

@ মাইকসামুয়েল ডাটাবেস? কোথায়? কে ভুল স্ট্রিং পরিবেশন করে? এটি সার্ভারে ডাটাবেস দোষী? সমস্ত EVAL এর প্রথমটি খারাপভাবে লিখিত সার্ভার সাইড কোডের জন্য দোষারোপ করা হবে না। Jsfiddle ব্যবহার করুন এবং বিশ্বকে এমন একটি বাস্তব বিশ্বের উদাহরণ দেখান যেখানে এটি ক্ষতির কারণ হতে পারে।
আকাশ কাভা

2
@ আকাশকাবা, আমি আপনার প্রশ্নটি বুঝতে পারি না। আমরা একটি নির্দিষ্ট অ্যাপ্লিকেশন সম্পর্কে কথা বলছি না, তবে ব্যবহার না করার কারণ eval। সার্ভারকে দোষ দেওয়া কীভাবে কার্যকর? যদি কাউকে দোষ দেওয়া যায় তবে তা আক্রমণকারী হওয়া উচিত। দোষ নির্বিশেষে, একটি ক্লায়েন্ট যে সার্ভারে বাগ সত্ত্বেও এক্সএসএসের পক্ষে ঝুঁকিপূর্ণ নয় এমন ক্লায়েন্ট যে দুর্বল তা থেকে ভাল, অন্য সব সমান।
মাইক স্যামুয়েল

0

এটি যদি সত্যই দরকার তবে মন্দ নয় not তবে আমি যে হোঁচট খেয়েছি তার 99.9% ব্যবহারের নয় প্রয়োজন (না setTimeout কাপড় সহ)।

আমার কাছে মন্দটি কোনও পারফরম্যান্স বা এমনকি কোনও সুরক্ষা সমস্যা নয় (ভাল, পরোক্ষভাবে এটি উভয়ই)। এই জাতীয় সমস্ত অপ্রয়োজনীয় ব্যবহার একটি রক্ষণাবেক্ষণ নরকে যুক্ত করে। রিফ্যাক্টরিং সরঞ্জামগুলি ফেলে দেওয়া হয়। কোড অনুসন্ধান করা শক্ত। এই ইওলগুলির অপ্রত্যাশিত প্রভাবগুলি হল সৈন্যবাহিনী।


5
সেট টাইমআউটের জন্য ইওল প্রয়োজনীয় নয়। আপনি সেখানে একটি ফাংশন রেফারেন্সও ব্যবহার করতে পারেন।
ম্যাথু ক্রামলে

0

জাভাস্ক্রিপ্ট এর eval () কখনই খারাপ নয়?

আমি সর্বদা ইওল ব্যবহার থেকে নিরুৎসাহিত করার চেষ্টা করি । প্রায় সর্বদা, আরও পরিষ্কার এবং রক্ষণাবেক্ষণযোগ্য সমাধান পাওয়া যায়। জেএসএন পার্সিংয়ের জন্যও ইভাল প্রয়োজন হয় না । ইভাল রক্ষণাবেক্ষণ নরকে যুক্ত করে । কোনও কারণ ছাড়াই নয়, এটি ডগলাস ক্রকফোর্ডের মতো কর্তা কর্তৃক সাফল্য পেয়েছে।

তবে আমি একটি উদাহরণ পেয়েছি যেখানে এটি ব্যবহার করা উচিত :

যখন আপনার এক্সপ্রেশনটি পাস করতে হবে।

উদাহরণস্বরূপ, আমার একটি ফাংশন রয়েছে যা google.maps.ImageMapTypeআমার জন্য একটি সাধারণ অবজেক্ট তৈরি করে, তবে আমাকে এটির রেসিপিটি বলতে হবে, এটি কীভাবে টাইল URL zoomএবং coordপরামিতিগুলি থেকে তৈরি করা উচিত :

my_func({
    name: "OSM",
    tileURLexpr: '"http://tile.openstreetmap.org/"+b+"/"+a.x+"/"+a.y+".png"',
    ...
});

function my_func(opts)
{
    return new google.maps.ImageMapType({
        getTileUrl: function (coord, zoom) {
            var b = zoom;
            var a = coord;
            return eval(opts.tileURLexpr);
        },
        ....
    });
}

3
দেখে মনে হচ্ছে এটি রিফ্যাক্টর হতে পারে যাতে eval () প্রয়োজন হয় না - tileURLexpr কেবলমাত্র একটি টেম্পলেট তাই প্রতিস্থাপন () এর কিছু বিচার্য ব্যবহার কাজটি করবে। তবুও, এটি প্রশ্ন জমা দেওয়ার সময় আমার মনে ছিল এমন একটি উদাহরণের কথা মনে করিয়ে দেয়, যা স্প্রেডশিটের কার্যকারিতার অনুরূপ কোনও ব্যবহারকারীকে গণিতের সূত্র নির্দিষ্ট করে দেওয়ার জন্য অনুমতি দেওয়া হয়েছিল। অবশ্যই আমি সেই সময়টি উল্লেখ করিনি কারণ আমি উত্তরগুলিকে প্রভাবিত করতে চাইনি!
রিচার্ড টার্নার

8
tileURL: function (zoom, coord) { return 'http://tile.openstreetmap.org/' + b + '/' + a.x + '/' + a.y + '.png'; },
কেসি চু

0

আমার ব্যবহারের উদাহরণ eval: আমদানি

এটি সাধারণত কীভাবে হয়।

var components = require('components');
var Button = components.Button;
var ComboBox = components.ComboBox;
var CheckBox = components.CheckBox;
...
// That quickly gets very boring

তবে এর সাহায্যে evalএবং একটি সামান্য সহায়ক ফাংশন এটি আরও ভাল চেহারা পায়:

var components = require('components');
eval(importable('components', 'Button', 'ComboBox', 'CheckBox', ...));

importable দেখতে দেখতে (এই সংস্করণটি কংক্রিট সদস্য আমদানি করতে সমর্থন করে না)।

function importable(path) {
    var name;
    var pkg = eval(path);
    var result = '\n';

    for (name in pkg) {
        result += 'if (name !== undefined) throw "import error: name already exists";\n'.replace(/name/g, name);
    }

    for (name in pkg) {
        result += 'var name = path.name;\n'.replace(/name/g, name).replace('path', path);
    }
    return result;
}

2
ধারণা জন্য +1, কিন্তু আপনি একটি বাগ এখানে আছে: .replace(/name/g, name).replace('path', path)। যদি nameস্ট্রিংটি থাকে "path"তবে আপনি আশ্চর্য হয়ে উঠতে পারেন।
ওয়াবেরি

1
প্রতিটি সম্পত্তির জন্য একটি ভেরিয়েবল ঘোষণা componentsকরা একটি সম্ভাব্য কোড গন্ধ; আপনার কোডটি রিফ্যাক্ট করা পুরোপুরি 'সমস্যা' দূর করতে পারে। আপনার বর্তমান সমাধানটি কেবল সিনট্যাকটিক চিনি। যদি আপনি এটি করার জন্য জেদ করেন, তবে আমি আপনাকে নিজের প্রিপ্রোসেসর লেখার পরামর্শ দেব, মোতায়েনের আগে মৃত্যুদণ্ড কার্যকর করা উচিত। যে evalউত্পাদন কোড থেকে দূরে রাখা উচিত ।
রুড হেল্ডারম্যান

0

ইভাল মন্দ নয়, কেবল অপব্যবহার করা।

আপনি যদি কোডটি এতে প্রবেশ করে তৈরি করেন বা এটি বিশ্বাস করতে পারেন, ঠিক আছে। লোকেরা কীভাবে ব্যবহারকারীর ইনপুটটি withওয়ালের সাথে গুরুত্বপূর্ণ নয় সে সম্পর্কে কথা বলতে থাকে। ভাল সাজান ~

যদি ব্যবহারকারীর ইনপুট থাকে যা সার্ভারে যায়, তবে ক্লায়েন্টের কাছে ফিরে আসে এবং সেই কোডটি স্যানিটাইজ না করেই ইওল ব্যবহৃত হয়। অভিনন্দন, আপনি যে কারও কাছে প্রেরণের জন্য প্যানডোরার বাক্সটি ব্যবহার করেছেন।

বিভাজনটি কোথায় রয়েছে তার উপর নির্ভর করে, অনেকগুলি ওয়েবসাইট এসপিএ ব্যবহার করে এবং এভাল ব্যবহারকারীর পক্ষে অ্যাপ্লিকেশন ইন্টার্নালগুলিতে অ্যাক্সেস করা আরও সহজ করে তুলতে পারে যা অন্যথায় সহজ ছিল না। এখন তারা একটি বোগাস ব্রাউজার এক্সটেনশন তৈরি করতে পারে যা সেই evওয়ালটিতে টেপ করতে পারে এবং আবার ডেটা চুরি করতে পারে।

খালি খালি ছবিটি ব্যবহার করা আপনার পয়েন্টটি কী। কোড জেনারেট করা আসলেই আদর্শ নয় যখন আপনি কেবল সেই ধরণের জিনিসটি ব্যবহার করতে, অবজেক্টগুলি ব্যবহার করতে পারেন বা পছন্দ করতে পারেন।

ইভাল ব্যবহারের এখন একটি দুর্দান্ত উদাহরণ। আপনার সার্ভারটি আপনার তৈরি করা সোয়াগার ফাইলটি পড়ছে। অনেকগুলি ইউআরএল প্যারাম বিন্যাসে তৈরি করা হয়েছে {myParam}। সুতরাং আপনি ইউআরএলগুলি পড়তে এবং তারপরে জটিল প্রতিস্থাপন না করে সেগুলি টেম্পলেট স্ট্রিংগুলিতে রূপান্তর করতে চান কারণ আপনার অনেকগুলি সমাপ্তি রয়েছে। সুতরাং আপনি এই জাতীয় কিছু করতে পারেন। নোট করুন এটি একটি খুব সাধারণ উদাহরণ।

const params = { id: 5 };

const route = '/api/user/{id}';
route.replace(/{/g, '${params.');

// use eval(route); to do something

-1

কোড জেনারেশন। আমি সম্প্রতি হাইপারবারস নামে একটি গ্রন্থাগার লিখেছি যা ভার্চুয়াল-ডোম এবং হ্যান্ডেলবারগুলির মধ্যে ব্যবধানকে সরিয়ে দেয় । এটি একটি হ্যান্ডেলবার টেম্পলেটকে বিশ্লেষণ করে এবং হাইপারস্ক্রিপ্টে রূপান্তর করে এটি করে । হাইপারস্ক্রিপ্টটি প্রথমে স্ট্রিং হিসাবে তৈরি করা হয় এবং এটি ফিরিয়ে দেওয়ার আগে eval()এটি কার্যকর করে দেওয়া কোডে পরিণত করা হয়। আমি eval()এই বিশেষ পরিস্থিতিতে খারাপের ঠিক বিপরীতটি পেয়েছি ।

মূলত থেকে

<div>
    {{#each names}}
        <span>{{this}}</span>
    {{/each}}
</div>

এই

(function (state) {
    var Runtime = Hyperbars.Runtime;
    var context = state;
    return h('div', {}, [Runtime.each(context['names'], context, function (context, parent, options) {
        return [h('span', {}, [options['@index'], context])]
    })])
}.bind({}))

এর পারফরম্যান্সটিও এ জাতীয় eval()পরিস্থিতিতে সমস্যা নয় কারণ আপনাকে কেবল একবার উত্পন্ন স্ট্রিংটি ব্যাখ্যা করতে হবে এবং তারপরে এক্সিকিউটেবল আউটপুটটিকে বহুবার পুনরায় ব্যবহার করতে হবে।

আপনি দেখতে পারেন কিভাবে কোড নির্মাণ অর্জন করা হয় যদি আপনি জানতে আগ্রহী এখানে


"হাইপারস্ক্রিপ্টটি প্রথমে স্ট্রিং হিসাবে তৈরি করা হয় (...)" বিল্ড পর্বে সমস্ত কোড জেনারেশন করার জন্য আরও বোধগম্যতা তৈরি করে, ফলস্বরূপ হাইপারসক্রিপ্ট কোডটি একটি পৃথক এক্সিকিউটেবল (.js) ফাইলে লিখুন, তারপরে পরীক্ষার জন্য ফাইলটি মোতায়েন করুন এবং উত্পাদন। আপনি কোড জেনারেশনটি যেভাবে ব্যবহার করেন তা আমি পছন্দ করি। এটি কেবল evalএকটি ইঙ্গিত যে সংকলন সম্পর্কিত কিছু দায়বদ্ধতা রানটাইমে স্থানান্তরিত হয়েছে into
রুড হেল্ডারম্যান

-1

আমার বিশ্বাস হ'ল ক্লায়েন্ট-সাইড ওয়েব অ্যাপ্লিকেশন এবং নিরাপদ ... জাভাস্ক্রিপ্টের মতো নিরাপদ, যা নেই সেগুলি ইওল একটি শক্তিশালী ফাংশন। :-) সুরক্ষা সমস্যাগুলি মূলত একটি সার্ভার-সাইড সমস্যা কারণ এখন, ফায়ারব্যাগের মতো সরঞ্জামের সাহায্যে আপনি যে কোনও জাভাস্ক্রিপ্ট অ্যাপ্লিকেশনকে আক্রমণ করতে পারেন।


1
ব্যবহারের evalচাহিদা XSS আক্রমণের, যা সবসময় সহজ অধিকার পেতে নয় বিরুদ্ধে সুরক্ষিত করা হবে।
বেনিয়ামিন

-1

যখন আপনার কাছে ম্যাক্রোগুলি নেই তখন কোড জেনারেশনের জন্য ইভাল কার্যকর।

(একজন নির্বোধ) উদাহরণস্বরূপ, আপনি যদি ব্রেইনফাক সংকলক লিখছেন তবে আপনি সম্ভবত একটি ফাংশন তৈরি করতে চাইবেন যা নির্দেশের ক্রমটিকে একটি স্ট্রিং হিসাবে সম্পাদন করবে এবং কোনও ফাংশন ফিরিয়ে দিতে এটিকে স্পষ্ট করবে।


হয় আপনি একটি সংকলক লিখুন (যা কোড উত্পন্ন হওয়ার পরিবর্তে সংরক্ষণ করে) বা আপনি একটি দোভাষী লিখেন (যেখানে প্রতিটি নির্দেশের প্রাক-সংকলন প্রয়োগ থাকে)। উভয়ই ব্যবহারের ক্ষেত্রে নয় eval
রুড হেল্ডারম্যান

আপনি যদি জাভাস্ক্রিপ্ট কোড তৈরি করেছেন এবং অবিলম্বে এটি সম্পাদন করতে চান (আসুন সরাসরি ব্যাখ্যার চেয়ে পারফরম্যান্স সুবিধার জন্য বলি), এটি আইভালের জন্য ব্যবহারের ক্ষেত্রে হবে।
এরিক হ্যালিউইক্জ

ভাল যুক্তি; আমি ব্লকলি সম্পর্কে এই নিবন্ধে একটি উদাহরণ দেখেছি । গুগলের পরামর্শে আমি স্তম্ভিত হয়েছি eval, যখন বিকল্প ( ফাংশন ) উভয়ই দ্রুত হয় ( এমডিএন তে বর্ণিত হিসাবে ) এবং আরও নির্ভরযোগ্য (একই ওয়েবপৃষ্ঠায় উত্পন্ন কোড এবং অন্যান্য 'সহায়ক' কোডের মধ্যে আরও ভাল বিচ্ছিন্নতা দ্বারা প্রত্যাশিত বাগগুলি প্রতিরোধ করে)।
রুড হেল্ডারম্যান

-5

আপনি যখন একটি পার্স ফাংশন (উদাহরণস্বরূপ, jQuery.parseJSON) দিয়ে একটি JSON কাঠামো বিশ্লেষণ করেন, তখন এটি JSON ফাইলের একটি নিখুঁত কাঠামো প্রত্যাশা করে (প্রতিটি সম্পত্তির নাম ডাবল উদ্ধৃতিতে থাকে)। তবে জাভাস্ক্রিপ্ট আরও নমনীয়। অতএব, আপনি এটি এড়ানোর জন্য eval () ব্যবহার করতে পারেন।


4
অন্ধভাবে ব্যবহার করবেন না eval, esp। তৃতীয় পক্ষের উত্স থেকে জেএসএন ডেটা পাওয়ার সময়। বৈশিষ্ট্যগুলিতে কোটস ছাড়াই JSON.Stringify দেখুন ? "উদ্ধৃত মূল নাম ছাড়া জেএসএন" পার্স করার সঠিক পদ্ধতির জন্য।
রব ডাব্লু

2
যদি এটি সম্পত্তির নামের আশেপাশে ডাবল উদ্ধৃতি ব্যবহার না করে, তবে এটি কোনও আক্ষরিক বস্তুর স্ট্রিং উপস্থাপনা হতে পারে, তবে এটি JSON নয় । JSON সম্পত্তি হিসাবে নাম হিসাবে সংজ্ঞা দেয়string একটি stringহিসাবে সংজ্ঞায়িত করে এবং ব্যাকস্ল্যাশ পলায়ন ব্যবহার করে ডাবল উদ্ধৃতিতে মোড়ানো শূন্য বা আরও বেশি ইউনিকোড অক্ষরের অনুক্রম
অকেজো কোড

নিকোলাস জাকাসের নিবন্ধটি দেখুন - "ইভাল () মন্দ নয়, কেবল ভুল বোঝাবুঝি" nczonline.net/blog/2013/06/25/eval-isnt-evil-just-misusedised
ভিটামালিনা

জাকাসের নিবন্ধ থেকে @ ভিটমালিনা: "আপনি যদি ব্যবহারকারী ইনপুট গ্রহণ করেন এবং এভাল () এর মাধ্যমে চালনা করেন তবে এটি বিপজ্জনক হতে পারে However তবে, যদি আপনার ইনপুটটি ব্যবহারকারীর কাছ থেকে না আসে তবে কি কোনও সত্যই বিপদ আছে?" ঠিক এটাই সমস্যা। আপনার কোডটি 'হ্যালো ওয়ার্ল্ড' অনুপাতের বাইরে গেলে, আপনি ব্যবহারকারীর ইনপুটটি ফাঁস করছেন না তা প্রমাণ করা দ্রুত অসম্ভব হয়ে যায় eval। যে কোনও গুরুতর বহু-ভাড়াটে ওয়েব অ্যাপ্লিকেশনে, কয়েক ডজন বিকাশকারী একই কোড বেসে কাজ করে, এটি গ্রহণযোগ্য নয়।
রুড হেল্ডারম্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.