কেন জাভাস্ক্রিপ্টের Eval ফাংশনটি ব্যবহার করা খারাপ ধারণা?


534

Alভাল ফাংশনটি কোডটিকে গতিময়ভাবে উত্পন্ন করার জন্য একটি শক্তিশালী এবং সহজ উপায়, সুতরাং ক্যাভেটগুলি কী?


92
সিমন উইলিসন দ্বারা স্পষ্ট হয়ে উঠবেন
ব্রায়ান সিং

5
মোডাসক্রিয়াট / জাভাস্ক্রিপ্ট - পারফরম্যান্স- টিপস - ট্রিক্সে বর্ণিত হিসাবে - (নতুন ফাংশন ( টিআরটি )) () ইওল (স্ট্র) থেকে বেশি পারফরম্যান্ট। মাত্র আমার 2 সেন্ট :)
গ্রিগুর

3
দৃশ্যত নতুন ফাংশন (ক) ক্রোমের ওয়াল (ক) এর চেয়ে 67% ধীর
ঘুম কী

আমার জন্য নতুন ফাংশন (ক) ওএসএক্সে 80% ধীর গতিরতম ক্রোম
জন স্মিথ

3
আমি একটি স্ট্যাটিক ফাংশন যুক্ত করেছি, কেবল পারফরম্যান্সের তুলনা করতে। jsperf.com/eval-vs-new-function/2
নেপক্সএক্স

উত্তর:


386
  1. ইনজেকশন আক্রমণগুলির জন্য ইওল এর ভুল ব্যবহার আপনার কোডটি খুলবে

  2. ডিবাগিং আরও চ্যালেঞ্জিং হতে পারে (কোনও লাইন নম্বর ইত্যাদি নয়)

  3. বিভাজনযুক্ত কোডটি ধীরে ধীরে কার্যকর করে (কোড সংকলন / ক্যাশে করার সুযোগ নেই)

সম্পাদনা: @ জেফ ওয়াল্ডেন মন্তব্যগুলিতে উল্লেখ করেছেন যে, ২০০৮ এর চেয়ে # 3 আজ কম সত্য। আরও সম্ভবত একটি পরিস্থিতি হ'ল আপনি স্ক্রিপ্টগুলি খালি করছেন যা প্রতিবারই সামান্য পরিবর্তন সাধিত হয়েছে এবং এর ফলে ক্যাশে করা যায়নি। আসুন আমরা কেবল এটিই বলে রাখি যে কিছু সংক্ষিপ্ত কোডটি আরও ধীরে ধীরে কার্যকর করে।


2
@ জেফওয়াল্ডেন, দুর্দান্ত মন্তব্য। আমি আমার পোস্ট আপডেট করেছি যদিও আমি বুঝতে পেরেছিলাম যে আপনি পোস্ট করার পরে এক বছর হয়ে গেছে। Xnzo72, আপনি যদি নিজের মন্তব্যটি কিছুটা যোগ্য করে ফেলেছিলেন (জেফ যেমন করেছিলেন) তবে আমি আপনার সাথে একমত হতে পারি। জেফ কীটি নির্দেশ করেছেন: "একই স্ট্রিংয়ের একাধিকবার প্রদর্শিত ওভারহেড পার্স করা এড়াতে পারে"। যেমনটি, আপনি ঠিক ভুল; # 3 অনেক পরিস্থিতিতে রয়েছে holds
Prestaul

7
@ প্রীতিল: যেহেতু অনুমিত আক্রমণকারী ক্লায়েন্টে জাভাস্ক্রিপ্ট পরিবর্তন করতে যে কোনও বিকাশকারী সরঞ্জাম ব্যবহার করতে পারে তাই আপনি কেন বলছেন যে ইভাল () আপনার কোডটি ইনজেকশন আক্রমণে খোলে? ইতিমধ্যে খোলা হয়নি? (আমি অবশ্যই ক্লায়েন্ট জাভাস্ক্রিপ্ট সম্পর্কে বলছি)
এডুয়ার্ডো মোল্টেনি

60
@ এডুয়ার্ডো মল্টেনি, আমরা তাদের নিজস্ব ব্রাউজারগুলিতে জেএস কার্যকর করতে ব্যবহারকারীদের (এবং প্রকৃতপক্ষে প্রতিরোধ করতে পারি না) যত্ন করি না। আমরা যে আক্রমণগুলি এড়াতে চাইছি সেগুলি হ'ল যখন ব্যবহারকারী সরবরাহিত মানগুলি সংরক্ষণ হয়, তারপরে পরে জাভাস্ক্রিপ্টে স্থাপন করা হয় এবং খণ্ডন করা যায়। উদাহরণস্বরূপ, আমি badHackerGuy'); doMaliciousThings();আমার ব্যবহারকারীর নামটি এতে নির্ধারণ করতে পারি: এবং আপনি যদি আমার ব্যবহারকারীর নামটি গ্রহণ করেন, এটি কিছু স্ক্রিপ্টে সংমিশ্রিত করে এবং এটি অন্য লোকের ব্রাউজারগুলিতে প্রকাশ করেন তবে আমি তাদের মেশিনে আমার যে কোনও জাভাস্ক্রিপ্ট চালাতে পারি (যেমন আমার পোস্টগুলিকে +1 করতে বাধ্য করে, তাদের ডেটা আমার সার্ভারে ইত্যাদি পোস্ট করুন))
প্রেস্টল

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

4
@ তামিলভেন্দন নিশ্চিত যে আপনি ব্রেকপয়েন্ট রাখতে পারেন। আপনি debugger;আপনার উত্স কোডটিতে বিবৃতি যুক্ত করে আপনার ক্লিষ্ট কোডিংয়ের জন্য ক্রোমের তৈরি ভার্চুয়াল ফাইল অ্যাক্সেস করতে পারেন । এটি সেই লাইনে আপনার প্রোগ্রামটির সম্পাদন বন্ধ করবে। তারপরে আপনি ডিবাগ ব্রেকপয়েন্টগুলি যুক্ত করতে পারেন যেমন এটি অন্য একটি জেএস ফাইল।
সিড

346

খারাপ সবসময় মন্দ হয় না। এমন সময় আছে যেখানে এটি পুরোপুরি উপযুক্ত।

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

একটি অতি-আদর্শ উদাহরণ দেওয়ার জন্য, ভেরিয়েবল 'আলু'তে সংরক্ষিত আইডি সহ কোনও উপাদানটির রঙ নির্ধারণ করতে:

eval('document.' + potato + '.style.color = "red"');

উপরে বর্ণিত কোডের লেখকদের যদি জাভাস্ক্রিপ্ট অবজেক্টগুলি কীভাবে কাজ করে তার বুনিয়াদি সম্পর্কে একটি ধারণা থাকে তবে তারা বুঝতে পেরেছিলেন যে আক্ষরিক বিন্দু-নামগুলির পরিবর্তে বর্গাকার বন্ধনী ব্যবহার করা যেতে পারে, যা খোলার প্রয়োজনীয়তা অবলম্বন করে:

document[potato].style.color = 'red';

... যা পড়তে অনেক সহজ পাশাপাশি সম্ভাব্য কম বগি।

(তবে তারপরে, কেউ / যাঁরা / সত্যিই জানতেন তারা কী করছে say

document.getElementById(potato).style.color = 'red';

যা ডকুমেন্টের অবজেক্টের বাইরে সরাসরি ডিওএম উপাদানগুলি অ্যাক্সেস করার অদ্ভুত পুরানো কৌশলটির চেয়ে বেশি নির্ভরযোগ্য more)


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

5
সম্মত হন। কখনও কখনও eval ঠিক আছে যেমন
ওয়েবসার্চগুলি

40
@ সকোয়েতবি: আপনি কি JSON এর JSON.parse()পরিবর্তে ব্যবহার করবেন না eval()?
nyuszika7h

4
@ বুবিন্স কোড. google.com/p/json-sans-eval সমস্ত ব্রাউজারে কাজ করে, তাই github.com/douglascrockford/JSON-js করে । ডগ ক্রকফোর্ডের json2.js অভ্যন্তরীণভাবে ব্যবহার করা যায় তবে চেক সহ। এ ছাড়া, এটি জেএসএনের জন্য অন্তর্নির্মিত ব্রাউজার সমর্থনের সাথে সামঞ্জস্যপূর্ণ forward
মার্টিজন

8
@ ববিন্স অনুপস্থিত জেএসওন লাইব্রেরি এবং অন্যান্য জিনিসগুলি হ্যান্ডেল করার জন্য বৈশিষ্ট্য-সনাক্তকরণ এবং পলফিল বলে কিছু আছে ( আধুনিকীকরণ.কম দেখুন )
মওগানরা

37

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


5
তাহলে বিকল্প কি?
আধুনিক

5
সত্যিই বিকল্পটি কেবল কোড লিখতে হয় যা এর প্রয়োজন হয় না। ক্রকফোর্ড এ সম্পর্কে দৈর্ঘ্যের মধ্যে চলে যায় এবং আপনার যদি এটি ব্যবহারের প্রয়োজন হয় তবে তিনি খুব বেশি বলেছেন যে এটি একটি প্রোগ্রামের ডিজাইনের ত্রুটি এবং এটি পুনর্নির্মাণের প্রয়োজন। সত্য, আমিও তার সাথে একমত। এর ত্রুটিগুলির জন্য জেএস সত্যিই নমনীয় এবং এটিকে নমনীয় করে তুলতে প্রচুর ঘরকে অনুমতি দেয়।
কেমিলার2002

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

6
আমি এই যুক্তিটি কিনছি না, কারণ এটি ইতিমধ্যে জাভাস্ক্রিপ্ট অ্যাপ্লিকেশনটিতে দুর্বৃত্ত কোড ইনজেক্ট করা সহজ। আমাদের ব্রাউজার কনসোল, স্ক্রিপ্ট এক্সটেনশানস ইত্যাদি রয়েছে ... ক্লায়েন্টের কাছে প্রেরিত কোডের প্রতিটি একক টুকরো ক্লায়েন্টকে কার্যকর করার জন্য isচ্ছিক।
ব্যবহারকারী 2867288

6
মূল কথাটি হ'ল আপনার ব্রাউজারে কোড ইনজেক্ট করা আমার পক্ষে সহজ। ধরা যাক আপনি কোয়েরি স্ট্রিংয়ে eval ব্যবহার করছেন। যদি আমি আপনাকে এমন কোনও লিঙ্কে ক্লিক করতে প্ররোচিত করি যা আমার ক্যোয়ারী স্ট্রিং সংযুক্ত সেই সাইটে যায় তবে আমি এখন ব্রাউজারের সম্পূর্ণ অনুমতি নিয়ে আপনার মেশিনে আমার কোডটি কার্যকর করেছি। আপনি সেই সাইটে আপনার টাইপ করা সমস্ত কি কী লগ করতে চান এবং তা আমাকে পাঠাতে চান? সম্পন্ন হয়েছে এবং আমাকে থামানোর কোনও উপায় নেই কারণ যখন উইলগুলি কার্যকর হয়, ব্রাউজারটি এটিকে সর্বোচ্চ কর্তৃত্ব দেয়।
kemiller2002

27

দুটি বিষয় মাথায় আসে:

  1. সুরক্ষা (তবে যতক্ষণ আপনি নিজেরাই মূল্যায়নের জন্য স্ট্রিংটি উত্পন্ন করেন ততক্ষণ এটি কোনও সমস্যাবিহীন হতে পারে)

  2. পারফরম্যান্স: যতক্ষণ না কার্যকর করা কোডটি অজানা, ততক্ষণ এটি অপ্টিমাইজ করা যায় না। (জাভাস্ক্রিপ্ট এবং অভিনয় সম্পর্কে, অবশ্যই স্টিভ ইয়েজের উপস্থাপনা )


9
সুরক্ষিত সমস্যা কেন যদি ক্লায়েন্ট যাইহোক আমাদের কোডটি সে / সে যা চায় তা করতে পারে? যন্ত্রশিল্পী ?
পল ব্রিউকজেনস্কি

2
@ পাউলব্রেসিঞ্জেন্সি, সুরক্ষার সমস্যাটি তখন উপস্থিত হয় যখন ব্যবহারকারী এ তার কোডের অংশটি evalউত্সাহিত করার জন্য সংরক্ষণ করে এবং তার পরে এই সামান্য কোডটির ব্যবহারকারীর বি ব্রাউজারে চলে
ফিলিপ পেরেইরা

21

ইভাল () এর কাছে ব্যবহারকারী ইনপুট পাস করা একটি সুরক্ষা ঝুঁকি, তবে এভালের প্রতিটি অনুরোধ () জাভাস্ক্রিপ্ট ইন্টারপ্রেটারের একটি নতুন উদাহরণ তৈরি করে। এটি একটি সংস্থান হগ হতে পারে।


27
আমি এর উত্তর দিয়ে 3+ বছর পরে, কী ঘটেছিল তা সম্পর্কে আমার বোঝাপড়া হয়েছে, আসুন আমরা বলি, আরও গভীরতর। আসলে যা ঘটে তা হ'ল একটি নতুন এক্সিকিউশন প্রসঙ্গ তৈরি করা হয়। Dmitrysoshnikov.com/ecmascript/chapter-1-execution-contexts
অ্যান্ড্রু হেজেস

20

আপনি সাধারণত ব্যবহারকারী ইনপুট পাস করলে এটি সাধারণত একটি সমস্যা।


16

মূলত, এটি রক্ষণাবেক্ষণ এবং ডিবাগ করা অনেক কঠিন। এটি একটি মত goto। আপনি এটি ব্যবহার করতে পারেন তবে সমস্যাগুলি খুঁজে পাওয়া আরও কঠিন এবং সেই লোকদের জন্য আরও কঠিন হতে পারে যাদের পরে পরিবর্তনের প্রয়োজন হতে পারে।


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

যতক্ষণ না স্ট্রিং ব্যবহারকারীর কাছ থেকে আসে না, বা আপনি যে ব্রাউজারটি করতে পারেন তা সীমাবদ্ধ থাকে। জাভাস্ক্রিপ্টে প্রোটোটাইপস, আইজজ [সদস্য], প্রক্সি, জসন.পারস, উইন্ডো, ডেকোরেটর ফাংশন (অ্যাডওয়্যারস) যেখানে নতুনফ = ডেকরেটার (ওল্ডফ), অ্যারে.প্রোটোটাইপ.ম্যাপ (এফ) এর মতো উচ্চতর ক্রম ফাংশন ব্যবহার করে স্টাফ ব্যবহার করে প্রচুর রূপক শক্তি রয়েছে , অন্যান্য ফাংশনগুলিতে আর্গুমেন্টগুলি passing} এর মাধ্যমে কীওয়ার্ড আর্গুমেন্টগুলি সরবরাহ করে passing আপনি কি আমাকে এমন কোনও ব্যবহারের ক্ষেত্রে বলতে পারেন যেখানে আপনি এইগুলির পরিবর্তে এগুলি করতে পারবেন না?
aoeu256

13

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

eval('al' + 'er' + 't(\'' + 'hi there!' + '\')');

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

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


1
কেবলমাত্র উপরের কোডটি আপডেট করা হচ্ছে .. - সেখানে! eval ('আল' + 'এর' + 'টি (' + '"হাই সেখানে!"' + ')');
মহেশ

2
[]["con"+"struc"+"tor"]["con"+"struc"+"tor"]('al' + 'er' + 't(\'' + 'hi there!' + '\')')()
কনরাড বোরোস্কি

3
হ্যাঁ, এমন সামাজিক নেটওয়ার্কিং সাইটগুলি ছিল যা সতর্কতা বাধা দেয় () তবে অনুমোদিত ()?
জোশডেন

12

আপনি গতিশীল কন্টেন্ট (সিজি বা ইনপুট এর মাধ্যমে) অবতীর্ণ না করা পর্যন্ত এটি আপনার পৃষ্ঠায় থাকা সমস্ত জাভাস্ক্রিপ্টের মতোই নিরাপদ এবং শক্ত।


এটি সত্য হলেও - যদি আপনার বিষয়বস্তু গতিশীল না হয় তবে এর জন্য ইওল ব্যবহার করার কোনও কারণ কী? আপনি কেবল কোনও ফাংশনে কোডটি রেখে দিতে পারেন এবং পরিবর্তে এটি কল করতে পারেন!
পেরিটা ব্রেটা ২

উদাহরণস্বরূপ - আজাক্স কল থেকে ফিরে আসা রিটার্নিং মান (জেএসএন লাইক, সার্ভার সংজ্ঞায়িত স্ট্রিং ইত্যাদি) পার্স করা।
Thevs

2
আচ্ছা বুঝলাম. আমি তাদের ডায়নামিক বলব কারণ ক্লায়েন্ট তারা কী তা সময়ের আগে জানে না তবে আপনি এখন কী বোঝাতে চেয়েছেন তা আমি দেখতে পাচ্ছি।
পেরিটা ব্রেটাটা

7

বাকী উত্তরের পাশাপাশি, আমি মনে করি না যে খ্রিস্টান বিবৃতিতে উন্নত কমানো থাকতে পারে।


6

এটি একটি সম্ভাব্য সুরক্ষা ঝুঁকি, এটি কার্যকর করার একটি পৃথক সুযোগ রয়েছে এবং এটি বেশ অকার্যকর, কারণ এটি কোডটি কার্যকর করার জন্য সম্পূর্ণ নতুন স্ক্রিপ্টিং পরিবেশ তৈরি করে। আরও কিছু তথ্যের জন্য এখানে দেখুন: eval

যদিও এটি বেশ কার্যকর, এবং সংযমের সাথে ব্যবহার করা অনেক ভাল কার্যকারিতা যুক্ত করতে পারে।


5

আপনি যদি 100% নিশ্চিত না হন যে কোডটি মূল্যায়ন করা হচ্ছে এটি কোনও বিশ্বস্ত উত্স থেকে (সাধারণত আপনার নিজের অ্যাপ্লিকেশন) থেকে হয় তবে এটি আপনার সিস্টেমকে ক্রস-সাইট স্ক্রিপ্টিং আক্রমণে প্রকাশ করার একটি নিশ্চিত উপায়।


1
কেবলমাত্র যদি আপনার সার্ভার-সাইড সুরক্ষাটি সফল হয়। ক্লায়েন্টের পক্ষের সুরক্ষাটি সোজা বাজে।
ডাবলআর্ট

5

আমি জানি যে এই আলোচনাটি পুরানো, তবে আমি গুগলের এই পদ্ধতিটি সত্যিই পছন্দ করি এবং অন্যদের সাথে এই অনুভূতিটি ভাগ করে নিতে চাই;)

অন্যটি বিষয় হ'ল যত ভাল আপনি তত বেশি বোঝার চেষ্টা করেন এবং শেষ পর্যন্ত আপনি বিশ্বাস করেন না যে কোনও কিছু ভাল বা খারাপ কারণ কেবল কেউ বলেছিল :) এটি একটি খুব অনুপ্রেরণামূলক ভিডিও যা আমাকে নিজের দ্বারা আরও ভাবতে সহায়তা করেছে :) ভাল অভ্যাসগুলি ভাল, তবে সেগুলি মূless়ভাবে ব্যবহার করবেন না :)


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

5

আপনি যে প্রসঙ্গে এটি ব্যবহার করছেন তা যদি আপনি জেনে থাকেন তবে এটি অগত্যা খারাপ নয়।

যদি আপনার অ্যাপ্লিকেশনটি eval()কোনও জেএসএন থেকে এমন কোনও অবজেক্ট তৈরি করতে ব্যবহার করছে যা আপনার বিশ্বস্ত সার্ভার-সাইড কোড দ্বারা নির্মিত কোনও এক্সএমএলএইচটিপিআরকেস্ট থেকে আপনার নিজের সাইটে ফিরে এসেছে , সম্ভবত এটি কোনও সমস্যা নয়।

অবিশ্বস্ত ক্লায়েন্ট-সাইড জাভাস্ক্রিপ্ট কোড যাইহোক এটি তেমন করতে পারে না। আপনি যে জিনিসটি নির্বাহ eval()করছেন তা সরবরাহ করা যুক্তিযুক্ত উত্স থেকে এসেছে, আপনি ভাল আছেন।


3
কেবল JSON পার্স করার চেয়ে ইওল ধীরগতি ব্যবহার করছে না?
ব্রেন্ডন লং

@Qix - আমার ব্রাউজারে যে পরীক্ষা চলছে (যেমন, Chrome 53) শো Eval যেমন কিছুটা তুলনায় দ্রুততর পার্স
পেরিটা ব্রেটা

পছন্দ করুন আমি ভাবছি কেন. সেই সময় আমি মন্তব্য করেছি যে এটি ছিল না। যাইহোক, সংস্করণ থেকে সংস্করণে রানটাইমের নির্দিষ্ট কিছু অঞ্চলে ক্রোমের অদ্ভুত পারফরম্যান্স বাড়ানো অসচেতন নয়।
কিউস - মোনিকা

এখানে একটি সামান্য পুরানো থ্রেড, তবে আমি যা পড়েছি তা দাবি করে না - আমি নিজেই এটি খুঁজে পেয়েছি - JSON.parse আসলে এটি এর চূড়ান্ত পর্যায়ে ইনপুট। দক্ষতা অনুসারে, আরও কাজ / সময় লাগে। তবে সুরক্ষার ভিত্তিতে কেন কেবল পার্স করবেন না? eval একটি দুর্দান্ত সরঞ্জাম। এটি অন্য কোনও উপায় নেই এমন জিনিসগুলির জন্য ব্যবহার করুন। JSON এর মাধ্যমে ফাংশনগুলি পাস করার জন্য, এটি ছাড়াই এটি করার একটি উপায় রয়েছে। JSON.stringify- র দ্বিতীয় প্যারামিটারটি আপনাকে চালানোর জন্য একটি কলব্যাক রাখতে দেয় যে এটি যদি কোনও ফাংশন হয় তবে আপনি টাইপফের মাধ্যমে চেক করতে পারেন। তারপরে ফাংশনের .toString () পান। আপনি যদি অনুসন্ধান করেন তবে এটিতে কিছু ভাল নিবন্ধ রয়েছে।
jdmayfield


4

আপনি যদি ব্যবহারকারীটিকে কিছু যৌক্তিক ফাংশন ইনপুট করতে চান এবং AND এর জন্য মূল্যায়ন করতে চান তবে জাভাস্ক্রিপ্টের Eval ফাংশনটি সঠিক। আমি দুটি স্ট্রিং এবং eval(uate) string1 === string2ইত্যাদি গ্রহণ করতে পারি


আপনি ফাংশন () use useও ব্যবহার করতে পারেন, তবে সার্ভারে এগুলি ব্যবহার করার সময় সতর্কতা অবলম্বন করুন যতক্ষণ না আপনি ব্যবহারকারীরা আপনার সার্ভারটি হাহাহাহাহা করতে চান।
aoeu256

3

আপনি যদি আপনার কোডটিতে ইভাল () ব্যবহারের বিষয়টি লক্ষ্য করেন, তবে মন্ত্রটি মনে রাখবেন "ইভাল () মন্দ।"

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

// antipattern
var property = "name";
alert(eval("obj." + property));

// preferred
var property = "name";
alert(obj[property]);

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

এটি মনে রাখাও গুরুত্বপূর্ণ যে setInterval(), স্ট্রিংগুলি পাস করা , setTimeout()এবং Function()নির্মাণকারী বেশিরভাগ অংশের মতোই ব্যবহারের অনুরূপ eval()এবং তাই এড়ানো উচিত।

পর্দার আড়ালে, জাভাস্ক্রিপ্টটিকে এখনও প্রোগ্রামিং কোড হিসাবে আপনি যে স্ট্রিংটি দিয়ে গেছেন তা মূল্যায়ন ও সম্পাদন করতে হবে:

// antipatterns
setTimeout("myFunc()", 1000);
setTimeout("myFunc(1, 2, 3)", 1000);

// preferred
setTimeout(myFunc, 1000);
setTimeout(function () {
myFunc(1, 2, 3);
}, 1000);

নতুন ফাংশন () কনস্ট্রাক্টর ব্যবহার করা ইভাল () এর অনুরূপ এবং যত্ন সহকারে যোগাযোগ করা উচিত। এটি একটি শক্তিশালী নির্মাণ হতে পারে তবে প্রায়শই এটির অপব্যবহার করা হয়। আপনার যদি অবশ্যই ব্যবহার করতে হয় তবে আপনি eval()পরিবর্তে নতুন ফাংশন () ব্যবহার করতে পারেন।

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

স্বয়ংক্রিয় গ্লোবালগুলি প্রতিরোধের আরেকটি উপায় হ'ল eval()কলটিকে তাত্ক্ষণিকভাবে ফাংশনে গুটিয়ে রাখা ।


আপনি কি সুপারিশ করতে পারেন যে আমি কীভাবে কোনও কার্যকারিতা ছাড়াই স্থানীয় ফাংশন-স্থানীয় গতিশীল পরিবর্তনশীল নামটি মূল্যায়ন করতে পারি? ইভাল (এবং অনুরূপ) ফাংশনগুলি হ'ল বেশিরভাগ ভাষায় লাস্ট রিসর্ট হয় যা সেগুলি ধারণ করে তবে কখনও কখনও এটি প্রয়োজনীয় হয়। গতিশীল ভেরিয়েবলের নাম পাওয়ার ক্ষেত্রে, কোনও সমাধান কি আরও সুরক্ষিত? যাইহোক, জাভাস্ক্রিপ্ট নিজেই সত্যিকারের সুরক্ষার জন্য নয় (সার্ভার-সাইডটি অবশ্যই মূল প্রতিরক্ষা)। আপনি যদি আগ্রহী হন তবে এখানে আমার ব্যবহারের ক্ষেত্রে কেসটি রয়েছে, যা আমি পরিবর্তন করতে চাই: stackoverflow.com/a/48294208
নিয়মিত জো

2

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


2

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


2

এই ভাল নিবন্ধগুলোর মধ্যে একটি Eval বিষয়ে কথা এবং কিভাবে তা অত্যন্ত মন্দ স্থান নয়: http://www.nczonline.net/blog/2013/06/25/eval-isnt-evil-just-misunderstood/

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


2

eval () খুব শক্তিশালী এবং একটি জেএস স্টেটমেন্ট কার্যকর করতে বা কোনও অভিব্যক্তি মূল্যায়নের জন্য ব্যবহার করা যেতে পারে। তবে প্রশ্নটি ইভাল () এর ব্যবহার সম্পর্কে নয় তবে কেবল কিছু বলতে দিন যে আপনি ওয়াল () এর সাথে চলমান স্ট্রিংটি কীভাবে দূষিত পক্ষ দ্বারা প্রভাবিত হবে is শেষে আপনি দূষিত কোড চালাবেন। ক্ষমতা সঙ্গে মহান দায়িত্ব আসে। সুতরাং আপনি এটি ব্যবহার করছেন তাই বিজ্ঞতার সাথে এটি ব্যবহার করুন। এটি eval () ফাংশনটির সাথে খুব বেশি সম্পর্কিত নয় তবে এই নিবন্ধটিতে বেশ ভাল তথ্য রয়েছে: http://blogs.popart.com/2009/07/javascript-inication-attacks/ আপনি যদি এভাল এর মূল বিষয়গুলি সন্ধান করেন () এখানে দেখুন: https://developer.mozilla.org/en-US/docs/Web/ জাভা স্ক্রিপ্ট / রেফারেন্স / গ্লোবাল_অবজেক্টস / ইভাল


2

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

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

অন্য কথায়, হতাশাবাদী অর্থে, এটির দ্বারা তৈরি হওয়া বেশিরভাগ অপ্টিমাইজেশন অর্থহীন, যদি উপস্থিত (..) উপস্থিত থাকে তবে এটি কেবল অপ্টিমাইজেশানগুলি সম্পাদন করে না।

এটি সব ব্যাখ্যা করে।

তথ্যসূত্র:

https://github.com/getify/You-Dont-Know-JS/blob/master/scope%20&%20closures/ch2.md#eval

https://github.com/getify/You-Dont-Know-JS/blob/master/scope%20&%20closures/ch2.md#performance


কোনও জাভাস্ক্রিপ্ট ইঞ্জিন 100% গ্যারান্টি সহ কোডটিতে খুঁজে পেতে পারে না al অতএব, এটি যে কোনও সময় এটি প্রস্তুত থাকতে হবে।
জ্যাক গিফিন 10'18

2

এটি সবসময় খারাপ ধারণা নয়। উদাহরণস্বরূপ, কোড উত্পাদন। আমি সম্প্রতি হাইপারবারস নামে একটি গ্রন্থাগার লিখেছি যা ভার্চুয়াল-ডোম এবং হ্যান্ডেলবারগুলির মধ্যে ব্যবধানকে সরিয়ে দেয় । এটি হ্যান্ডেলবারের টেম্পলেটটি বিশ্লেষণ করে এবং হাইপারস্ক্রিপ্টে রূপান্তর করে যা পরবর্তীতে ভার্চুয়াল-ডোম দ্বারা ব্যবহৃত হয়। হাইপারস্ক্রিপ্টটি প্রথমে স্ট্রিং হিসাবে তৈরি করা হয় এবং এটি ফিরিয়ে দেওয়ার আগে 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()পরিস্থিতিতে সমস্যা নয় কারণ আপনাকে কেবল একবার উত্পন্ন স্ট্রিংটি ব্যাখ্যা করতে হবে এবং তারপরে এক্সিকিউটেবল আউটপুটটিকে বহুবার পুনরায় ব্যবহার করতে হবে।

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


2

আমি যতদূর বলব যে eval()আপনি ব্রাউজারগুলিতে চালিত জাভাস্ক্রিপ্টটিতে ব্যবহার করলে তা আসলেই কিছু যায় আসে না * * (সাবধানতা)

সমস্ত আধুনিক ব্রাউজারগুলির একটি বিকাশকারী কনসোল রয়েছে যেখানে আপনি যেকোনভাবে যথেচ্ছ জাভাস্ক্রিপ্ট সম্পাদন করতে পারেন এবং যে কোনও আধা-স্মার্ট বিকাশকারী আপনার জেএস উত্সটি দেখতে পারেন এবং এর যা কিছু বিট লাগবে তারা যা চান তা করতে দেব কনসোলে রেখে দিতে পারেন।

* যতক্ষণ না আপনার সার্ভারের এন্ডপয়েন্টগুলিতে ব্যবহারকারীর সরবরাহিত মানগুলির সঠিক বৈধতা এবং স্যানিটাইজেশন রয়েছে, ততক্ষণ আপনার ক্লায়েন্টের পাশের জাভাস্ক্রিপ্টে কী পার্স এবং বিভক্ত হবে তা বিবেচনা করা উচিত নয়।

যদি এটি ব্যবহার করার জন্য উপযুক্ত জিজ্ঞাসা করতে হলে eval()তবে পিএইচপি, উত্তর কোন , যদি না আপনি পরিচ্ছন্ন তালিকা কোনো মান আপনার Eval বিবৃতি হস্তান্তর করা হতে পারে।


কেবল কোনও ডেভ কনসোলই নয়, আপনি জাভাস্ক্রিপ্টও টাইপ করতে পারেন: পৃষ্ঠায় নিজের ডেভ কনসোলটি তৈরি করতে url বারে কোড না থাকলে, যেমন পুরানো আইই ব্রাউজার এবং মোবাইল ডিভাইসগুলির ক্ষেত্রে রয়েছে।
দিমিত্রি

1

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

//Place this in a common/global JS lib:
var NS = function(namespace){
    var namespaceParts = String(namespace).split(".");
    var namespaceToTest = "";
    for(var i = 0; i < namespaceParts.length; i++){
        if(i === 0){
            namespaceToTest = namespaceParts[i];
        }
        else{
            namespaceToTest = namespaceToTest + "." + namespaceParts[i];
        }

        if(eval('typeof ' + namespaceToTest) === "undefined"){
            eval(namespaceToTest + ' = {}');
        }
    }
    return eval(namespace);
}


//Then, use this in your class definition libs:
NS('Root.Namespace').Class = function(settings){
  //Class constructor code here
}
//some generic method:
Root.Namespace.Class.prototype.Method = function(args){
    //Code goes here
    //this.MyOtherMethod("foo"));  // => "foo"
    return true;
}


//Then, in your applications, use this to instantiate an instance of your class:
var anInstanceOfClass = new Root.Namespace.Class(settings);

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


3
এটি দিয়ে namespaceToTest[namespaceParts[i]]এখানে কাজ করা যায়, এখানে if(typeof namespaceToTest[namespaceParts[i]] === 'undefined') { namespaceToTest[namespaceParts[i]] = {};else namespaceToTest = namespaceToTest[namespaceParts[i]];
evওয়ালের

1

আবর্জনা সংগ্রহ

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

সমস্যাটি ডেমো করার জন্য এখানে একটি স্ক্রিপ্ট রয়েছে

https://jsfiddle.net/CynderRnAsh/qux1osnw/

document.getElementById("evalLeak").onclick = (e) => {
  for(let x = 0; x < 100; x++) {
    eval(x.toString());
  }
};

উপরের কোডের মতো সাধারণ কিছু অ্যাপ্লিকেশনটির মৃত্যুর আগে পর্যন্ত অল্প পরিমাণে মেমরি সঞ্চয় করে। এটি আরও খারাপ হয় যখন বিবর্তিত স্ক্রিপ্টটি একটি দৈত্য ফাংশন হয় এবং অন্তরকে ডেকে আনে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.