Alভাল ফাংশনটি কোডটিকে গতিময়ভাবে উত্পন্ন করার জন্য একটি শক্তিশালী এবং সহজ উপায়, সুতরাং ক্যাভেটগুলি কী?
Alভাল ফাংশনটি কোডটিকে গতিময়ভাবে উত্পন্ন করার জন্য একটি শক্তিশালী এবং সহজ উপায়, সুতরাং ক্যাভেটগুলি কী?
উত্তর:
ইনজেকশন আক্রমণগুলির জন্য ইওল এর ভুল ব্যবহার আপনার কোডটি খুলবে
ডিবাগিং আরও চ্যালেঞ্জিং হতে পারে (কোনও লাইন নম্বর ইত্যাদি নয়)
বিভাজনযুক্ত কোডটি ধীরে ধীরে কার্যকর করে (কোড সংকলন / ক্যাশে করার সুযোগ নেই)
সম্পাদনা: @ জেফ ওয়াল্ডেন মন্তব্যগুলিতে উল্লেখ করেছেন যে, ২০০৮ এর চেয়ে # 3 আজ কম সত্য। আরও সম্ভবত একটি পরিস্থিতি হ'ল আপনি স্ক্রিপ্টগুলি খালি করছেন যা প্রতিবারই সামান্য পরিবর্তন সাধিত হয়েছে এবং এর ফলে ক্যাশে করা যায়নি। আসুন আমরা কেবল এটিই বলে রাখি যে কিছু সংক্ষিপ্ত কোডটি আরও ধীরে ধীরে কার্যকর করে।
badHackerGuy'); doMaliciousThings();
আমার ব্যবহারকারীর নামটি এতে নির্ধারণ করতে পারি: এবং আপনি যদি আমার ব্যবহারকারীর নামটি গ্রহণ করেন, এটি কিছু স্ক্রিপ্টে সংমিশ্রিত করে এবং এটি অন্য লোকের ব্রাউজারগুলিতে প্রকাশ করেন তবে আমি তাদের মেশিনে আমার যে কোনও জাভাস্ক্রিপ্ট চালাতে পারি (যেমন আমার পোস্টগুলিকে +1 করতে বাধ্য করে, তাদের ডেটা আমার সার্ভারে ইত্যাদি পোস্ট করুন))
debugger;
আপনার উত্স কোডটিতে বিবৃতি যুক্ত করে আপনার ক্লিষ্ট কোডিংয়ের জন্য ক্রোমের তৈরি ভার্চুয়াল ফাইল অ্যাক্সেস করতে পারেন । এটি সেই লাইনে আপনার প্রোগ্রামটির সম্পাদন বন্ধ করবে। তারপরে আপনি ডিবাগ ব্রেকপয়েন্টগুলি যুক্ত করতে পারেন যেমন এটি অন্য একটি জেএস ফাইল।
খারাপ সবসময় মন্দ হয় না। এমন সময় আছে যেখানে এটি পুরোপুরি উপযুক্ত।
যাইহোক, ইভাল বর্তমানে এবং historতিহাসিকভাবে ব্যাপকভাবে অতিরিক্ত লোকেরা ব্যবহার করছেন যারা জানেন না যে তারা কী করছেন। এর মধ্যে জাভাস্ক্রিপ্ট টিউটোরিয়াল লেখার লোক রয়েছে, দুর্ভাগ্যক্রমে এবং কিছু ক্ষেত্রে এর প্রকৃতপক্ষে সুরক্ষা পরিণতি হতে পারে - বা প্রায়শই সরল বাগ। সুতরাং আমরা ইওল এর উপর একটি প্রশ্ন চিহ্ন ছুঁড়ে ফেলতে যত বেশি করতে পারি তত ভাল। আপনি যখনই ইওল ব্যবহার করেন তখন আপনার কী করা হচ্ছে সেগুলি পরীক্ষা-নিরীক্ষণ করা দরকার কারণ আপনি এটি আরও ভাল, নিরাপদ এবং ক্লিনার উপায়ে করার সম্ভাবনা রয়েছে।
একটি অতি-আদর্শ উদাহরণ দেওয়ার জন্য, ভেরিয়েবল 'আলু'তে সংরক্ষিত আইডি সহ কোনও উপাদানটির রঙ নির্ধারণ করতে:
eval('document.' + potato + '.style.color = "red"');
উপরে বর্ণিত কোডের লেখকদের যদি জাভাস্ক্রিপ্ট অবজেক্টগুলি কীভাবে কাজ করে তার বুনিয়াদি সম্পর্কে একটি ধারণা থাকে তবে তারা বুঝতে পেরেছিলেন যে আক্ষরিক বিন্দু-নামগুলির পরিবর্তে বর্গাকার বন্ধনী ব্যবহার করা যেতে পারে, যা খোলার প্রয়োজনীয়তা অবলম্বন করে:
document[potato].style.color = 'red';
... যা পড়তে অনেক সহজ পাশাপাশি সম্ভাব্য কম বগি।
(তবে তারপরে, কেউ / যাঁরা / সত্যিই জানতেন তারা কী করছে say
document.getElementById(potato).style.color = 'red';
যা ডকুমেন্টের অবজেক্টের বাইরে সরাসরি ডিওএম উপাদানগুলি অ্যাক্সেস করার অদ্ভুত পুরানো কৌশলটির চেয়ে বেশি নির্ভরযোগ্য more)
JSON.parse()
পরিবর্তে ব্যবহার করবেন না eval()
?
আমি বিশ্বাস করি এটি কারণ এটি কোনও স্ট্রিং থেকে কোনও জাভাস্ক্রিপ্ট ফাংশন কার্যকর করতে পারে। এটি ব্যবহার করে লোকেরা অ্যাপ্লিকেশনটিতে দুর্বৃত্ত কোড ইনজেক্ট করা সহজ করে তোলে।
দুটি বিষয় মাথায় আসে:
সুরক্ষা (তবে যতক্ষণ আপনি নিজেরাই মূল্যায়নের জন্য স্ট্রিংটি উত্পন্ন করেন ততক্ষণ এটি কোনও সমস্যাবিহীন হতে পারে)
পারফরম্যান্স: যতক্ষণ না কার্যকর করা কোডটি অজানা, ততক্ষণ এটি অপ্টিমাইজ করা যায় না। (জাভাস্ক্রিপ্ট এবং অভিনয় সম্পর্কে, অবশ্যই স্টিভ ইয়েজের উপস্থাপনা )
eval
উত্সাহিত করার জন্য সংরক্ষণ করে এবং তার পরে এই সামান্য কোডটির ব্যবহারকারীর বি ব্রাউজারে চলে
ইভাল () এর কাছে ব্যবহারকারী ইনপুট পাস করা একটি সুরক্ষা ঝুঁকি, তবে এভালের প্রতিটি অনুরোধ () জাভাস্ক্রিপ্ট ইন্টারপ্রেটারের একটি নতুন উদাহরণ তৈরি করে। এটি একটি সংস্থান হগ হতে পারে।
আপনি সাধারণত ব্যবহারকারী ইনপুট পাস করলে এটি সাধারণত একটি সমস্যা।
মূলত, এটি রক্ষণাবেক্ষণ এবং ডিবাগ করা অনেক কঠিন। এটি একটি মত goto
। আপনি এটি ব্যবহার করতে পারেন তবে সমস্যাগুলি খুঁজে পাওয়া আরও কঠিন এবং সেই লোকদের জন্য আরও কঠিন হতে পারে যাদের পরে পরিবর্তনের প্রয়োজন হতে পারে।
একটি জিনিস মনে রাখবেন যে আপনি প্রায়শই অন্যথায় সীমাবদ্ধ পরিবেশে কোড সম্পাদন করতে ইওল () ব্যবহার করতে পারেন - নির্দিষ্ট নেটওয়ার্কিং সাইটগুলি যা নির্দিষ্ট জাভাস্ক্রিপ্ট ফাংশনগুলিকে অবরুদ্ধ করে থাকে কখনও কখনও তাদেরকে এভাল ব্লকে ভেঙে বোকা বানানো যেতে পারে -
eval('al' + 'er' + 't(\'' + 'hi there!' + '\')');
সুতরাং আপনি যদি এমন কিছু জাভাস্ক্রিপ্ট কোড চালানোর সন্ধান করছেন যেখানে এটি অন্যথায় অনুমোদিত নাও হতে পারে ( মাইস্পেস , আমি আপনাকে দেখছি ...) তবে ইভাল () একটি কার্যকর কৌশল হতে পারে।
তবে, উপরে উল্লিখিত সমস্ত কারণে, আপনার নিজের কোডের জন্য এটি ব্যবহার করা উচিত নয়, যেখানে আপনার সম্পূর্ণ নিয়ন্ত্রণ রয়েছে - এটি কেবল প্রয়োজনীয় নয়, এবং আরও ভাল 'ট্র্যাভিয়া জাভাস্ক্রিপ্ট হ্যাকস' শেল্ফটিতে আবদ্ধ।
[]["con"+"struc"+"tor"]["con"+"struc"+"tor"]('al' + 'er' + 't(\'' + 'hi there!' + '\')')()
আপনি গতিশীল কন্টেন্ট (সিজি বা ইনপুট এর মাধ্যমে) অবতীর্ণ না করা পর্যন্ত এটি আপনার পৃষ্ঠায় থাকা সমস্ত জাভাস্ক্রিপ্টের মতোই নিরাপদ এবং শক্ত।
বাকী উত্তরের পাশাপাশি, আমি মনে করি না যে খ্রিস্টান বিবৃতিতে উন্নত কমানো থাকতে পারে।
এটি একটি সম্ভাব্য সুরক্ষা ঝুঁকি, এটি কার্যকর করার একটি পৃথক সুযোগ রয়েছে এবং এটি বেশ অকার্যকর, কারণ এটি কোডটি কার্যকর করার জন্য সম্পূর্ণ নতুন স্ক্রিপ্টিং পরিবেশ তৈরি করে। আরও কিছু তথ্যের জন্য এখানে দেখুন: eval ।
যদিও এটি বেশ কার্যকর, এবং সংযমের সাথে ব্যবহার করা অনেক ভাল কার্যকারিতা যুক্ত করতে পারে।
আপনি যদি 100% নিশ্চিত না হন যে কোডটি মূল্যায়ন করা হচ্ছে এটি কোনও বিশ্বস্ত উত্স থেকে (সাধারণত আপনার নিজের অ্যাপ্লিকেশন) থেকে হয় তবে এটি আপনার সিস্টেমকে ক্রস-সাইট স্ক্রিপ্টিং আক্রমণে প্রকাশ করার একটি নিশ্চিত উপায়।
আমি জানি যে এই আলোচনাটি পুরানো, তবে আমি গুগলের এই পদ্ধতিটি সত্যিই পছন্দ করি এবং অন্যদের সাথে এই অনুভূতিটি ভাগ করে নিতে চাই;)
অন্যটি বিষয় হ'ল যত ভাল আপনি তত বেশি বোঝার চেষ্টা করেন এবং শেষ পর্যন্ত আপনি বিশ্বাস করেন না যে কোনও কিছু ভাল বা খারাপ কারণ কেবল কেউ বলেছিল :) এটি একটি খুব অনুপ্রেরণামূলক ভিডিও যা আমাকে নিজের দ্বারা আরও ভাবতে সহায়তা করেছে :) ভাল অভ্যাসগুলি ভাল, তবে সেগুলি মূless়ভাবে ব্যবহার করবেন না :)
আপনি যে প্রসঙ্গে এটি ব্যবহার করছেন তা যদি আপনি জেনে থাকেন তবে এটি অগত্যা খারাপ নয়।
যদি আপনার অ্যাপ্লিকেশনটি eval()
কোনও জেএসএন থেকে এমন কোনও অবজেক্ট তৈরি করতে ব্যবহার করছে যা আপনার বিশ্বস্ত সার্ভার-সাইড কোড দ্বারা নির্মিত কোনও এক্সএমএলএইচটিপিআরকেস্ট থেকে আপনার নিজের সাইটে ফিরে এসেছে , সম্ভবত এটি কোনও সমস্যা নয়।
অবিশ্বস্ত ক্লায়েন্ট-সাইড জাভাস্ক্রিপ্ট কোড যাইহোক এটি তেমন করতে পারে না। আপনি যে জিনিসটি নির্বাহ eval()
করছেন তা সরবরাহ করা যুক্তিযুক্ত উত্স থেকে এসেছে, আপনি ভাল আছেন।
এটি সুরক্ষা সম্পর্কে আপনার আত্মবিশ্বাসের স্তরকে হ্রাস করে।
আপনি যদি ব্যবহারকারীটিকে কিছু যৌক্তিক ফাংশন ইনপুট করতে চান এবং AND এর জন্য মূল্যায়ন করতে চান তবে জাভাস্ক্রিপ্টের Eval ফাংশনটি সঠিক। আমি দুটি স্ট্রিং এবং eval(uate) string1 === string2
ইত্যাদি গ্রহণ করতে পারি
আপনি যদি আপনার কোডটিতে ইভাল () ব্যবহারের বিষয়টি লক্ষ্য করেন, তবে মন্ত্রটি মনে রাখবেন "ইভাল () মন্দ।"
এই ফাংশনটি একটি স্বেচ্ছাসেবী স্ট্রিং নেয় এবং এটি জাভাস্ক্রিপ্ট কোড হিসাবে কার্যকর করে। যখন প্রশ্নের মধ্যে কোডটি আগে থেকেই জানা থাকে (রানটাইম নির্ধারিত হয় না), ইভাল () ব্যবহার করার কোনও কারণ নেই। কোডটি রানটাইমের সময়ে যদি গতিশীলভাবে উত্পন্ন হয়, তবে প্রায়শই ইওল () ছাড়াই লক্ষ্য অর্জনের আরও ভাল উপায়। উদাহরণস্বরূপ, গতিশীল বৈশিষ্ট্য অ্যাক্সেস করতে স্কোয়ার ব্র্যাকেট স্বরলিপি ব্যবহার করা আরও ভাল এবং সহজ:
// 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()
কলটিকে তাত্ক্ষণিকভাবে ফাংশনে গুটিয়ে রাখা
।
আপনি যদি ব্যবহারকারী-জমা দেওয়া কোডটি সম্পাদন করে থাকেন তবে সম্ভাব্য সুরক্ষার সমস্যাগুলি ছাড়াও বেশিরভাগ সময় এর চেয়ে ভাল উপায় আছে যেটি প্রতিবার সম্পাদিত হওয়ার সাথে সাথে কোডটিকে পুনরায় পার্স করার সাথে জড়িত না। বেনামে ফাংশন বা অবজেক্টের বৈশিষ্ট্যগুলি ইওালের বেশিরভাগ ব্যবহারগুলিকে প্রতিস্থাপন করতে পারে এবং অনেক বেশি নিরাপদ এবং দ্রুত হয়।
এই ভাল নিবন্ধগুলোর মধ্যে একটি Eval বিষয়ে কথা এবং কিভাবে তা অত্যন্ত মন্দ স্থান নয়: http://www.nczonline.net/blog/2013/06/25/eval-isnt-evil-just-misunderstood/
আমি বলছি না যে আপনি রান আউট হয়ে যান এবং সর্বত্র ইওল () ব্যবহার শুরু করুন start আসলে, এভ্যাল চালানোর জন্য খুব কম ব্যবহারের ক্ষেত্রে খুব কমই আছে ()। কোডের স্পষ্টতা, ডিবাগিবিলিটি এবং অবশ্যই কর্মক্ষমতা যা অবশ্যই উপেক্ষা করা উচিত নয় তা নিয়ে অবশ্যই উদ্বেগ রয়েছে। যখন আপনার কাছে কেস রয়েছে যেখানে ইভিএল () বোঝা যায় তখন আপনি এটি ব্যবহার করতে ভয় পাবেন না। প্রথমে এটি ব্যবহার না করার চেষ্টা করুন, তবে আপনার কোডটি আরও ভঙ্গুর বা কম নিরাপদ কিনা তা ভেবে কাউকে আপনাকে ভয় দেখাতে দেবেন না ev
eval () খুব শক্তিশালী এবং একটি জেএস স্টেটমেন্ট কার্যকর করতে বা কোনও অভিব্যক্তি মূল্যায়নের জন্য ব্যবহার করা যেতে পারে। তবে প্রশ্নটি ইভাল () এর ব্যবহার সম্পর্কে নয় তবে কেবল কিছু বলতে দিন যে আপনি ওয়াল () এর সাথে চলমান স্ট্রিংটি কীভাবে দূষিত পক্ষ দ্বারা প্রভাবিত হবে is শেষে আপনি দূষিত কোড চালাবেন। ক্ষমতা সঙ্গে মহান দায়িত্ব আসে। সুতরাং আপনি এটি ব্যবহার করছেন তাই বিজ্ঞতার সাথে এটি ব্যবহার করুন। এটি eval () ফাংশনটির সাথে খুব বেশি সম্পর্কিত নয় তবে এই নিবন্ধটিতে বেশ ভাল তথ্য রয়েছে: http://blogs.popart.com/2009/07/javascript-inication-attacks/ আপনি যদি এভাল এর মূল বিষয়গুলি সন্ধান করেন () এখানে দেখুন: https://developer.mozilla.org/en-US/docs/Web/ জাভা স্ক্রিপ্ট / রেফারেন্স / গ্লোবাল_অবজেক্টস / ইভাল
জাভাস্ক্রিপ্ট ইঞ্জিনে সংকলন পর্যায়ে এটি সম্পাদন করে এমন অনেকগুলি পারফরম্যান্স অপ্টিমাইজেশন রয়েছে। এর মধ্যে কয়েকটি কোডটি লেক্স হওয়ার সাথে সাথে মূলত স্থিতিশীলভাবে বিশ্লেষণ করতে সক্ষম হয়ে ওঠে এবং সমস্ত ভেরিয়েবল এবং ফাংশন ঘোষণাগুলি কোথায় তা পূর্ব নির্ধারণ করে, যাতে মৃত্যুদন্ড কার্যকর করার সময় সনাক্তকারীদের সমাধান করতে কম প্রচেষ্টা গ্রহণ করা হয়।
তবে ইঞ্জিন যদি কোডটিতে একটি 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
এটি সবসময় খারাপ ধারণা নয়। উদাহরণস্বরূপ, কোড উত্পাদন। আমি সম্প্রতি হাইপারবারস নামে একটি গ্রন্থাগার লিখেছি যা ভার্চুয়াল-ডোম এবং হ্যান্ডেলবারগুলির মধ্যে ব্যবধানকে সরিয়ে দেয় । এটি হ্যান্ডেলবারের টেম্পলেটটি বিশ্লেষণ করে এবং হাইপারস্ক্রিপ্টে রূপান্তর করে যা পরবর্তীতে ভার্চুয়াল-ডোম দ্বারা ব্যবহৃত হয়। হাইপারস্ক্রিপ্টটি প্রথমে স্ট্রিং হিসাবে তৈরি করা হয় এবং এটি ফিরিয়ে দেওয়ার আগে 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()
পরিস্থিতিতে সমস্যা নয় কারণ আপনাকে কেবল একবার উত্পন্ন স্ট্রিংটি ব্যাখ্যা করতে হবে এবং তারপরে এক্সিকিউটেবল আউটপুটটিকে বহুবার পুনরায় ব্যবহার করতে হবে।
আপনি দেখতে পারেন কিভাবে কোড নির্মাণ অর্জন করা হয় যদি আপনি জানতে আগ্রহী এখানে ।
আমি যতদূর বলব যে eval()
আপনি ব্রাউজারগুলিতে চালিত জাভাস্ক্রিপ্টটিতে ব্যবহার করলে তা আসলেই কিছু যায় আসে না * * (সাবধানতা)
সমস্ত আধুনিক ব্রাউজারগুলির একটি বিকাশকারী কনসোল রয়েছে যেখানে আপনি যেকোনভাবে যথেচ্ছ জাভাস্ক্রিপ্ট সম্পাদন করতে পারেন এবং যে কোনও আধা-স্মার্ট বিকাশকারী আপনার জেএস উত্সটি দেখতে পারেন এবং এর যা কিছু বিট লাগবে তারা যা চান তা করতে দেব কনসোলে রেখে দিতে পারেন।
* যতক্ষণ না আপনার সার্ভারের এন্ডপয়েন্টগুলিতে ব্যবহারকারীর সরবরাহিত মানগুলির সঠিক বৈধতা এবং স্যানিটাইজেশন রয়েছে, ততক্ষণ আপনার ক্লায়েন্টের পাশের জাভাস্ক্রিপ্টে কী পার্স এবং বিভক্ত হবে তা বিবেচনা করা উচিত নয়।
যদি এটি ব্যবহার করার জন্য উপযুক্ত জিজ্ঞাসা করতে হলে eval()
তবে পিএইচপি, উত্তর কোন , যদি না আপনি পরিচ্ছন্ন তালিকা কোনো মান আপনার Eval বিবৃতি হস্তান্তর করা হতে পারে।
আমি এখানে আগে যা কিছু বলেছিল তার খণ্ডন করার চেষ্টা করব না, তবে আমি এই শব্দটি () যতদূর জানি আমি এই উপায়টি অন্য কোনও উপায়ে সম্পন্ন করতে পারি না 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);
সম্পাদনা করুন: যাইহোক, আমি প্রস্তাব দেব না (সমস্ত সুরক্ষার কারণে এখানে পূর্বে নির্দেশিত) আপনি ব্যবহারকারীর ইনপুট নেভিগেশন আপনি বস্তুর নাম বেস যে। আপনি যদিও এটি করতে চান এমন কোনও ভাল কারণ আমি কল্পনা করতে পারি না। তবুও, ভেবেছিলাম আমি এটি উল্লেখ করব যে এটি কোনও ভাল ধারণা হবে না :)
namespaceToTest[namespaceParts[i]]
এখানে কাজ করা যায়, এখানে if(typeof namespaceToTest[namespaceParts[i]] === 'undefined') { namespaceToTest[namespaceParts[i]] = {};
else namespaceToTest = namespaceToTest[namespaceParts[i]];
আবর্জনা সংগ্রহ
ব্রাউজারের আবর্জনা সংগ্রহের কোনও ধারণা নেই যদি সবিস্তৃত কোডটি মেমরি থেকে সরানো যায় তবে পৃষ্ঠাটি পুনরায় লোড না হওয়া পর্যন্ত এটি কেবল এটি সংরক্ষণ করা থাকে। খুব শীঘ্রই যদি আপনার ব্যবহারকারীরা খুব শীঘ্রই আপনার পৃষ্ঠায় থাকে তবে এটি ওয়েব অ্যাপের জন্য সমস্যা হতে পারে।
সমস্যাটি ডেমো করার জন্য এখানে একটি স্ক্রিপ্ট রয়েছে
https://jsfiddle.net/CynderRnAsh/qux1osnw/
document.getElementById("evalLeak").onclick = (e) => {
for(let x = 0; x < 100; x++) {
eval(x.toString());
}
};
উপরের কোডের মতো সাধারণ কিছু অ্যাপ্লিকেশনটির মৃত্যুর আগে পর্যন্ত অল্প পরিমাণে মেমরি সঞ্চয় করে। এটি আরও খারাপ হয় যখন বিবর্তিত স্ক্রিপ্টটি একটি দৈত্য ফাংশন হয় এবং অন্তরকে ডেকে আনে।