জাভাস্ক্রিপ্ট এভাল বৈশিষ্ট্যের "অনুচিত ব্যবহার" কে কী গঠন করে? [বন্ধ]


13

ইভাল একটি কুখ্যাত বিতর্কিত ভাষা বৈশিষ্ট্য। ডগলাস ক্রকফোর্ড ফ্ল্যাট আউট এটি প্রত্যাখ্যান। আমি ভাবছি যে এভাল কোন নির্দিষ্ট ঝুঁকি নিয়ে আসে। এই প্রশ্ন অনুযায়ী Improper use of eval opens up your code for injection attacks,।

ইভাল কমান্ডের কিছু অযৌক্তিক ব্যবহারগুলি কী এবং সেগুলি কী সুরক্ষা গর্ত খুলবে?

উত্তর:


31

ফিরে যখন আমি জেএসক্রিপ্ট ইঞ্জিনটি বাস্তবায়ন করছিলাম তখন আমি ইভিল আইভিল শার্টগুলি মুদ্রিত থাকার পক্ষে পরামর্শ দিয়েছিলাম তবে দুঃখের বিষয় আমরা কখনই এটির কাছে পাইনি।

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

এই শিরাতে আরও কিছু ধারণার জন্য 2003 এ আমার নিবন্ধগুলি দেখুন:

সাধারণ পাপাচার:

http://blogs.msdn.com/b/ericlippert/archive/2003/11/01/53329.aspx

ইনজেকশন আক্রমণ অশুভতা:

http://blogs.msdn.com/b/ericlippert/archive/2003/11/04/53335.aspx


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

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

আমি উত্তর আমি দেখেছিলেন এক ইচ্ছুক পারেন এখানে বা তাই নিজেই বলেছেন কী আপনার দ্বিতীয় লিংক রাজ্যের: যে eval()হয় না ক্লায়েন্ট (ব্রাউজার) কোডের উপর একটি নিরাপত্তা ঝুঁকি।
sq33G

4

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

তুচ্ছ এবং অকেজো উদাহরণ হিসাবে, একটি সরল জাভাস্ক্রিপ্ট ক্যালকুলেটর:

textbox1.value = eval(textbox2.value);

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


1

কিছু কিছু বিষয় একটি Eval মত ফাংশন ছাড়া জাতীয় না করা অসম্ভব যে হয় ( eval, Functionএবং হয়ত বেশি)।

applyউদাহরণস্বরূপ নিন । এটি সাধারণ ফাংশন কলগুলিতে ব্যবহার করার সময় এটি ব্যবহার করা সহজ:

foo.apply(null, [a, b, c])

তবে আপনি নতুন সিনট্যাক্সের মাধ্যমে তৈরি করা সামগ্রীর জন্য কীভাবে আপনি এটি করবেন?

new Foo.apply(null, [a, b, c]) কাজ করে না, অনুরূপ ফর্মও করে না।

তবে আপনি এই সীমাবদ্ধতার মাধ্যমে evalবা এর মাধ্যমে Function( Functionএই উদাহরণে আমি ব্যবহার করতে পারি) কাজ করতে পারেন :

Function.prototype.New = (function () {
    var fs = [];
    return function () {
        var f = fs[arguments.length];
        if (f) {
            return f.apply(this, arguments);
        }
        var argStrs = [];
        for (var i = 0; i < arguments.length; ++i) {
            argStrs.push("a[" + i + "]");
        }
        f = new Function("var a=arguments;return new this(" + argStrs.join() + ");");
        if (arguments.length < 100) {
            fs[arguments.length] = f;
        }
        return f.apply(this, arguments);
    };
}) ();

উদাহরণ:

Foo.New.apply(null, [a, b, c]);

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


2
সত্য, তবে ওপির প্রশ্নটি ছিল " ইভাল কমান্ডের কিছু অযৌক্তিক ব্যবহারগুলি কী এবং তারা কোন সুরক্ষা গর্তগুলি খুলবে? " নয়, "এর কী ভাল ব্যবহার eval()? "
রস প্যাটারসন

1
@ রসপ্যাটারসন: অনুমান আমি বেশিরভাগ প্রশ্নের শিরোনাম হা হা।
থমাস এডিং

তবুও, খারাপ ভাষার বৈশিষ্ট্যের জন্য ভাল ব্যবহারের জন্য +1 :-)
রস প্যাটারসন

1

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

সেই ক্ষেত্রে দূষিত যে কোনও কিছু করা যেতে পারে তা বিকাশকারী তাদের F12 সরঞ্জাম খোলার মাধ্যমেও করতে পারত।


0

আমি সম্মত হই যে এটি খুব কম ব্যবহার করা উচিত, তবে আমি এর জন্য একটি শক্তিশালী ব্যবহারের সন্ধান পেয়েছি eval

ফায়ারফক্সে একটি পরীক্ষামূলক নতুন বৈশিষ্ট্য রয়েছে যা asm.js নামে আমি কাজ করছি। এটি জাভাস্ক্রিপ্ট ভাষার সীমিত উপসেটকে স্থানীয় কোডে সংকলিত করার অনুমতি দেয়। হ্যাঁ, এটি খুব দুর্দান্ত, তবে এর সীমাবদ্ধতা রয়েছে। আপনি জাভাস্ক্রিপ্টের সীমিত উপসেটটিকে জাভাস্ক্রিপ্টে এম্বেড হওয়া সি-জাতীয় ভাষা হিসাবে ভাবতে পারেন। এটি আসলে পড়া বা লেখা মানুষের দ্বারা বোঝানো হয়নি।

জাভাস্ক্রিপ্টের এই সীমাবদ্ধ উপসেটটি আমার রানটাইম-উত্পন্ন কোডটি সংকলিত কোডের সংকলিত কোডে ইনজেক্ট করার অনুমতি দেয় না।

আমি এমন কিছু কোড লিখেছি যা ব্যবহারকারীর কাছে পরিচিত পরিচয়, একটি গাণিতিক অভিব্যক্তি লেখার অনুমতি দেয় এবং এটি ফ্লাইতে asm.js কোডে রূপান্তরিত করে। যদি না আমি সার্ভার সাইডে কোডটি প্রসেস করতে চাইতাম (যা আমি করি না) evalতবে একমাত্র সরঞ্জাম যা আমাকে ফলাফলটি কোডটি রিয়েল-টাইমে ব্রাউজার দ্বারা প্রসেস করতে দেয়।


0

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

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

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

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

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


-3

আমার এমন একটি পরিস্থিতি রয়েছে যেখানে alভাল দেখতে যাওয়ার মতো দেখায়, একটি স্ট্রিংকে মূল্যায়ন করে এবং কোনও বিদ্যমান ভেরিয়েবল ফিরিয়ে দেয় যার নাম স্ট্রিংয়ের মতো।

আমার বেশ কয়েকটি টেবিল রয়েছে: টেবিল 1 ফলাফলগুলি টেবিল, টেবিল 2 ফলাফলগুলি টেবিল, টেবিলএনআরএসল্টস টেবিল। আমার কাছে একই নামগুলির সাথে ভেরিয়েবলগুলি সেট আপ করা হয়েছে, সেগুলি হল jQuery ডেটাবেল অবজেক্ট। আমি এগুলি টেবিলগুলি সেট আপ করতে এবং সেগুলিতে jQuery ডেটাটেবল ফাংশনগুলি কল করতে ব্যবহার করি।

প্রতিটি টেবিলের ক্লাস = "ফলাফলের টেবিল" নির্ধারিত থাকে। এখন, টেবিলটি ক্লিক করা হলে আমার পরিবর্তনশীল হওয়া দরকার। আমি এটি করছি:

$('resultsTable).on('click', 'td', function(event) {
    var cResultsTable = eval(event.target.parentElement.parentElement.parentElement.id);
    [etc]
});

সুতরাং আমি যে টেবিলটিতে ঘরটি ক্লিক করা হয়েছিল তার আইডি পাচ্ছি, যার সাথে ডেটাটেবল অবজেক্ট ভেরিয়েবলের একই নাম রয়েছে। কারও কাছে উন্নতির জন্য যদি আমার কাছে পরামর্শ থাকে তবে আমি এটি সম্পর্কে জানতে চাই।


1
তোমার কেন দরকার? আইডিটি কোড নয়, একটি সরল স্ট্রিং হওয়া উচিত। যাইহোক, event.target.parentElement.parentElement.parentElementভয়ঙ্কর। তবুও, আমি প্রত্যাশা করছিলাম alভাল কলটি একটি "রেফারেন্স ত্রুটি: [আইডি] সংজ্ঞায়িত করা হয়নি" ত্রুটি উত্পন্ন করবে, যদি না আপনি ইচ্ছাকৃতভাবে মূল্যায়নযোগ্য আইডি ব্যবহার করেন (যা ভাঙ্গা, ভুল, এবং যদি আপনি শেষ না করেন তবে অদ্ভুত জিনিস ঘটতে পারে) সদৃশ আইডি উত্পন্ন)।
ব্রায়ান

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

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

1
সম্ভবত আমি নিজেকে পরিষ্কার করছি না আপনি যদি কোনও সমতল (যেমন, নন-জেএস) স্ট্রিংয়ের উপরে কল করেন, আপনি ব্যতিক্রম ছুঁড়ে ফেলবেন। সুতরাং, আপনার eval ব্যবহারের কোনও অর্থ নেই। আপনি যদি আইডির একই নামের সাথে কোনও অবজেক্ট ভেরিয়েবল জেনারেট করে থাকেন তবে আপনার কোডটি কাজ করবে ... তবে আমাকে ভাঙ্গা হিসাবে আঘাত করবে। আমি বরং ব্যবহার করে ভেরিয়েবলটি তৈরি করতাম document.getElementById(ID).MySpecialProperty = MYSPECIALPROPERTYVALUE(এটি দুর্দান্ত যে তা নয়, তবে এটি স্পষ্টর চেয়ে ভাল)। এরিক লিপার্ট যেমন উল্লেখ করেছেন, "জেএসক্রিপ্টের প্রতিটি বস্তু ইতিমধ্যে একটি সারণী।"
ব্রায়ান

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