জেএসএন.পারস বনাম ইওল ()


94

আমার স্পাইডার সেন্স আমাকে সতর্ক করেছে যে eval()আগত জেএসওনকে বিশ্লেষণ করতে ব্যবহার করা একটি খারাপ ধারণা। আমি কেবল ভাবছি JSON.parse()- যা আমি মনে করি জাভাস্ক্রিপ্টের একটি অংশ এবং ব্রাউজার-নির্দিষ্ট ফাংশন নয় - এটি আরও সুরক্ষিত কিনা।


পারফরম্যান্স অনুসারে, কমপক্ষে ভি 8 (ক্রোমিয়ামের জেএস ইঞ্জিন) এর JSON.parseচেয়ে দ্রুত evalউত্স
পল

উত্তর:


110

আক্রমণগুলি ব্যবহার করার ক্ষেত্রে আপনি আরও ঝুঁকির মধ্যে আছেনeval : জেএসএন হ'ল জাভাস্ক্রিপ্টের একটি উপসেট এবং json.parse কেবল JSON কে পার্স করে যেখানে evalসমস্ত জেএস এক্সপ্রেশনগুলির জন্য দরজা উন্মুক্ত রাখবে।


"আপনি আক্রমণে বেশি ঝুঁকছেন" , আমি সম্পূর্ণ একমত নই!
হাইড্রোপার

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

4
@ হাইড্রো ধারণার সংক্ষিপ্ত প্রমাণ: চেষ্টা করুন eval('alert(1)');
ভ্যালারিও বোজ

37

সমস্ত JSON.parseবাস্তবায়ন সম্ভবত ব্যবহার হয়eval()

JSON.parseডগলাস ক্রকফোর্ডের সমাধানের উপর ভিত্তি করে তৈরি করা হয়েছে যা 497 লাইনেeval() ঠিক সেখানে ব্যবহার করে ।

// In the third stage we use the eval function to compile the text into a
// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
// in JavaScript: it can begin a block or an object literal. We wrap the text
// in parens to eliminate the ambiguity.

j = eval('(' + text + ')');

এর সুবিধাটি JSON.parseহ'ল এটি যুক্তিটি সঠিক JSON সিনট্যাক্সটি যাচাই করে।


56
হ্যাঁ, ঠিক আগে লাইনটি যাচাই করে যে এটি নিরাপদ এবং বৈধ স্ট্রিং।
নিকফ

6
আমি JSON.parse()আমার লিনাক্স মিন্ট সিস্টেমে ফায়ারফক্স 28 এবং ক্রোমিয়াম 33 এ পরীক্ষা করেছি। এটি eval()ফায়ারফক্সের মতো 2x এবং ক্রোমিয়ামে 4x গতিযুক্ত ছিল। আপনি কোন সোর্স কোড পোস্ট করছেন তা আমি নিশ্চিত নই তবে আমার ব্রাউজারগুলিতে সেগুলি একই জিনিস নয়।
jbo5112

@ প্লডডার "সুবিধা" সম্ভবত এটি যাচাই করা সস্তা নয়।
মিমি

4
আধুনিক ব্রাউজারগুলি দেশীয় JSON.parse()বাস্তবায়ন সরবরাহ করে যা eval()বেসড পার্সারদের চেয়ে নিরাপদ এবং দ্রুত ।
মোহাম্মদ আলহশশ

15

সমস্ত ব্রাউজারের নেটিভ জেএসওএন সমর্থন নেই তাই এমন সময় আসবে যেখানে আপনাকে eval() জেএসএন স্ট্রিং ব্যবহার করতে হবে। Http://json.org থেকে জেএসএন পার্সার ব্যবহার করুন যা আপনার পক্ষে সবকিছু সহজসাধ্যভাবে পরিচালনা করে।

Eval() এটি একটি মন্দ তবে কিছু ব্রাউজারের বিরুদ্ধে এটি একটি প্রয়োজনীয় মন্দ তবে যেখানে আপনি এটি এড়াতে পারবেন, তাই করুন !!!!!


12

JSON.parse () এবং eval () গ্রহণ করবে তার মধ্যে পার্থক্য রয়েছে। এটি সম্পর্কে চেষ্টা করুন:

var x = "{\" শপিংকার্টনাম \ ": \" শপিং_কার্ট: 2000 \ "}"

eval(x)         //won't work
JSON.parse(x)   //does work

এই উদাহরণটি দেখুন ।


4
eval কাজ করে না কারণ এটি কোড স্টেটমেন্ট হিসাবে স্ট্রিংগুলিকে পার্স করে এবং এইভাবে, "expression ...}" কে মান ঘোষণার এক্সপ্রেশনের পরিবর্তে কোড এক্সপ্রেশন হিসাবে বিবেচনা করে। আপনি যদি অস্পষ্টতা অপসারণ করেন ("[{....}]" উদাহরণস্বরূপ), অভিব্যক্তিটির প্রকৃতি নিয়ে কোনও সন্দেহ নেই এবং
ইওল ইচ্ছাশক্তি

4
হ্যাঁ. Ditionতিহ্যগতভাবে, এক্স বন্ধনী দ্বারা আবৃত হবে: ইভাল ("(" + x + ")")। আমি যা বলেছিলাম তা এখনও দাঁড়িয়ে আছে: JSON.parse () ব্যবহার করার সময় কোনও দ্বিধা নেই।
জেফ লোরি

9

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

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


4

জেএসএন জাভাস্ক্রিপ্টের কেবলমাত্র একটি উপসেট। তবে evalপুরো জাভাস্ক্রিপ্ট ভাষাটি মূল্যায়ন করে কেবল জেএসওনের উপসেটটি নয়।


ঠিক আছে, আমি জানি। আপনি কি বোঝাচ্ছেন যে JSON.parse () কেবল JSON এর মূল্যায়ন করে এবং অন্যান্য সমস্ত আগত ডেটাতে ব্যর্থ হয়? বা এটি কেবল এর জন্য একটি মোড়ক: var myObject = eval ('(' + প্রতিক্রিয়া পাঠ্য + ')'); ??
কেভিন মেজর

6
@ কেভিন মেজর: হ্যাঁ, স্থানীয়ভাবে প্রয়োগ করা হয়েছে JSON.parse(সরাসরি জাভাস্ক্রিপ্ট ইঞ্জিনে প্রয়োগ করা হয়েছে) কেবল জেএসএনকে পার্স করে। তবে অন্যান্য অ-নেটিভ বাস্তবায়নগুলি কিছুটা স্যানিটি পরীক্ষা করে এবং তারপরে evalপারফরম্যান্সের কারণে ব্যবহার করে ।
গম্বো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.