পিএইচপি এভাল অশুভতা কখন?


84

সমস্ত বছর আমি পিএইচপি বিকাশ করে চলেছি, আমি সবসময় শুনেছি যে ব্যবহার eval()করা খারাপ evil

নিম্নলিখিত কোড বিবেচনা করে, দ্বিতীয় (এবং আরও মার্জিত) বিকল্পটি ব্যবহার করা কি বোধগম্য হবে না? তা না হলে কেন?

// $type is the result of an SQL statement
// e.g. SHOW COLUMNS FROM a_table LIKE 'a_column';
// hence you can be pretty sure about the consistency
// of your string
$type = "enum('a','b','c')";

// possibility one
$type_1 = preg_replace('#^enum\s*\(\s*\'|\'\s*\)\s*$#', '', $type);
$result = preg_split('#\'\s*,\s*\'#', $type_1);

// possibility two
eval('$result = '.preg_replace('#^enum#','array', $type).';');

4
eval সবসময়ই খারাপ, পিএইচপি বেনাম ফাংশনগুলি প্রবর্তন করার পরে, কোড লেখার জন্য সবসময় আরও ভাল উপায় থাকে। এই উদাহরণে আমি ব্যবহার করব$result = array(); preg_replace_callback('#^enum\s*\(\s*\'|\'\s*\)\s*$#', function($m) use($result) { $result[] = $m[1]; }, $type);
জেফ্রি

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

উত্তর:


134

আমি ওয়ালকে () খাঁটি মন্দ বলার ক্ষেত্রে সতর্ক হতে চাই। গতিশীল মূল্যায়ন একটি শক্তিশালী সরঞ্জাম এবং কখনও কখনও জীবন রক্ষাকারী হতে পারে। Eval () এর মাধ্যমে কেউ পিএইচপি এর ত্রুটিগুলি নিয়ে কাজ করতে পারে (নীচে দেখুন)।

ইভাল () সহ প্রধান সমস্যাগুলি হ'ল:

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

প্রকৃত ব্যবহারের () ব্যবহারের মূল সমস্যাটি কেবল একটি:

  • অনভিজ্ঞ বিকাশকারীরা যারা যথেষ্ট বিবেচনা ছাড়াই এটি ব্যবহার করেন।

থাম্বের নিয়ম হিসাবে আমি এটি অনুসরণ করতে ঝোঁক:

  1. কখনও কখনও eval () একমাত্র / সঠিক সমাধান।
  2. বেশিরভাগ ক্ষেত্রেই অন্য কিছু চেষ্টা করা উচিত।
  3. যদি অনিশ্চিত হন তবে যান 2।
  4. অন্যথায়, খুব, খুব সাবধান।

4
এটিও এভাল () এড়াতে পুনরুদ্ধার করা যেতে পারে, বিশেষত যদি $ শ্রেণীর নামটি শ্বেত তালিকাভুক্ত থাকে তবে এটি অবশ্যই ইওল () ব্যবহারের বিনোদন দেওয়ার জন্য হতে হবে। সুসংবাদটি যদিও 5.3 হিসাবে, oo foo :: বার () বৈধ।
রোজোকা

@রোজোকা: আপনি কী আমাদের পিএইচপি ৫.২-তে ইওল () ছাড়াই এটি করবেন তা উদাহরণ দিতে পারেন, দয়া করে?
মিশা রুদনিকি

30
আমি নিশ্চিত নই যে এটি বিবেচিত হয়েছে কিনা বা না, তবে $ ফলাফল = কল_উজার_ফুনক (অ্যারে ('ফু', 'বার')); একটি যাদুমন্ত্র মত কাজ করে.
আয়নু জি স্টান

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

অনিরাপদ ইনপুটটি
এড়াতে পারা যায়

40

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

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

তাই থাম্বের নিয়ম হিসাবে: এটি ভুলে যান। যখন উত্তরটি উত্তর হয় আপনি প্রস্তাবটি ভুল প্রশ্ন জিজ্ঞাসা করুন! ;-)


6
কখনও কখনও eval উত্তর হয়। আমরা অনলাইন-গেম অ্যাপ্লিকেশনটিতে কাজ করি এবং সত্তাগুলির মধ্যে অত্যন্ত জটিল সম্পর্কের কারণে সেখানে প্রমাণগুলি এড়ানো খুব কঠিন ... তবে আইএমএইচও 90% ক্ষেত্রে এর উত্তর নয়।
জেট

19
আমি এমন পরিস্থিতি দেখতে সত্যিই আগ্রহী হব যেখানে কেবলমাত্র উত্তরটিই উত্তর the
আয়নু জি স্টান

4
@ আইয়নট জি। স্ট্যান ডাটাবেস-সঞ্চিত কাস্টমগুলি অবজেক্ট / সত্তার জন্য ট্রিগার করে?
কুরোকি কাজে

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

4
@ খ্রিস্টিয়ান: আপনার প্রথমে একটি উদাহরণ লিখতে হবে ( পেস্টবিন.কম ব্যবহার করুন এবং লিঙ্কটি এখানে পেস্ট করুন), যেখানে আপনি মনে করেন যে ব্যবহারটি এড়ানো eval()অসম্ভব, এটি একটি আরও ভাল পদ্ধতির। অনেক লোক বলেছেন eval()কিছু ক্ষেত্রে অনিবার্য, তবে তারা যে সুনির্দিষ্ট উদাহরণের সাথে আমরা তর্ক করতে পারি তা উল্লেখ করে না - এই বিতর্কটি বোঝায় না। সুতরাং দয়া করে, লোকেরা যারা eval()অনিবার্য বলে , তারা আগে প্রমাণ করুন!
Sk8erPeter

19

eval সর্বদা সমানভাবে "দুষ্ট"।

আপনি যদি alভাল () কে খারাপ হিসাবে দেখেন তবে তা সর্বদা মন্দ। এটি প্রসঙ্গের উপর নির্ভর করে যাদুকরভাবে তার অশুভ-জাতীয়তা হারাবে না।

আমার মতে, জিজ্ঞাসা করা হয় "কখন খারাপ হয় () খারাপ নয়?" বোঝা যাচ্ছে যে ইওল () ব্যবহার করে যা কিছু ত্রুটি ঘটেছিল তা যাদুতে কিছু প্রসঙ্গে প্রেরণ করা যায়।

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

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

আপনি এগুলিকে আসলে খারাপ হিসাবে দেখেন বা না দেখুন বা আপনি ব্যক্তিগতভাবে কিছু ক্ষেত্রে ইওল () ব্যবহার করে ন্যায়সঙ্গত করতে পারেন তা আপনার উপর নির্ভর করে। কারও কারও মতে দুষ্টতা এটিকে ন্যায্য প্রমাণ করার পক্ষে খুব দুর্দান্ত এবং অন্যের কাছে evভাল () হ'ল একটি শর্টকাট।


4
আপনি একটি প্রোগ্রামার একটি নরক করা।
খ্রিস্টান

4
"তদ্ব্যতীত, এমন কোনও পরিস্থিতি নেই যার জন্য ইওল () ব্যবহার করা একেবারে প্রয়োজনীয়" "পিএইচপি ডক্সে দেওয়া উদাহরণ অনুসারে, আমি একটি ডাটাবেসে সঞ্চিত কোডটি সম্পাদন করতে চাইলে কী হবে?
ইয়ারিন

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

13
এটি আরেকটি আক্রমণ ভেক্টর যুক্ত করে - একটি এসকিউএল ইঞ্জেকশন ওয়েবে সার্ভারে নির্বিচার পিএইচপি কোড চালাতে পারে। এটি eval () ব্যবহার প্রয়োজন। এটি বাইটকোড ক্যাশে অনুকূলিত করা যায় না। এটি আপনার কোড এবং ডেটা আলাদা করার নীতি লঙ্ঘন করে। এটি আপনার অ্যাপ্লিকেশনটিকে কম পোর্টেবল করতে পারে - পিএইচপি আপডেট করতে / ঠিক করতে আপনাকে ডাটাবেসও আপডেট করতে হবে।
thomasrutter

4
আমি বলব যে যদি কিছু কেবলমাত্র ইভাল ব্যবহারের মাধ্যমে অর্জন করা যায়, তবে এটি কিছু করে নিয়ে পুনর্বিবেচনা করা ভাল। গতিময়ভাবে রানটাইমে ক্লাস তৈরি করা খারাপ ধারণা বলে মনে হয়। কিছু কোড জেনারেশন নিয়োগ না করে এমন কোড তৈরি করে যা তাদের আগে সময়ের সাথে সংজ্ঞা দেয়?
thomasrutter

15

এই ক্ষেত্রে, ইভাল সম্ভবত যথেষ্ট নিরাপদ, যতক্ষণ না কোনও ব্যবহারকারীর দ্বারা সারণীতে স্বেচ্ছাসেবী কলাম তৈরি করা সম্ভব হয় না।

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

$json = str_replace(array(
    'enum', '(', ')', "'"), array)
    '',     '[', ']', "'"), $type);
$result = json_decode($json);

একটি নিয়মিত প্রকাশ সম্ভবত সবচেয়ে সুস্পষ্ট উপায়। আপনি এই স্ট্রিং থেকে সমস্ত মান বের করতে একক নিয়মিত অভিব্যক্তি ব্যবহার করতে পারেন:

$extract_regex = '/
    (?<=,|enum\()   # Match strings that follow either a comma, or the string "enum("...
    \'      # ...then the opening quote mark...
    (.*?)       # ...and capture anything...
    \'      # ...up to the closing quote mark...
    /x';
preg_match_all($extract_regex, $type, $matches);
$result = $matches[1];

4
যদিও এটি প্রতি সে প্রশ্নের প্রশ্নের উত্তর দেয়নি, তবে এই প্রশ্নের খুব ভাল উত্তর: এনামকে পার্স করার সর্বোত্তম উপায়টি কী হবে () ... আপনাকে ধন্যবাদ;)
পিয়েরে স্প্রিং

13

eval() ধীর, তবে আমি এটিকে মন্দ বলব না।

এটি আমাদের ব্যবহারের খারাপ ব্যবহার যা কোড ইনজেকশন তৈরি করতে এবং মন্দ হতে পারে।

একটি সহজ উদাহরণ:

$_GET = 'echo 5 + 5 * 2;';
eval($_GET); // 15

একটি ক্ষতিকারক উদাহরণ:

$_GET = 'system("reboot");';
eval($_GET); // oops

আমি আপনাকে ব্যবহার না করার পরামর্শ দিচ্ছি তবে আপনি eval()যদি তা করেন তবে নিশ্চিত হয়ে নিন যে আপনি সমস্ত ইনপুট বৈধ করেছেন / শ্বেতলিস্ট করেছেন ist


12

আপনি যখন ইওলটির অভ্যন্তরে বিদেশী ডেটা (যেমন ব্যবহারকারী ইনপুট) ব্যবহার করছেন।

আপনার উপরের উদাহরণে এটি কোনও সমস্যা নয়।


7

আমি স্পষ্টতই এখানে সামগ্রী চুরি করব:

  1. প্রকৃতির সাথে প্রাকৃতিক মূল্যায়ন সর্বদা সুরক্ষার উদ্বেগ হতে চলেছে।

  2. সুরক্ষা উদ্বেগ ছাড়াও অবিশ্বাস্যরকম ধীর হওয়ার সমস্যাও রয়েছে। পিএইচপি 4.3.10 এ আমার পরীক্ষায় এর 10 গুণ ধীর তারপর সাধারণ কোড এবং পিএইচপি 5.1 বিটা 1 তে 28 বার ধীর।

ব্লগ.জোশোয়াইচর্ন.কম: পিএইচপি ব্যবহার করে-


5

eval()হয় সবসময় মন্দ।

  • নিরাপত্তার কারণে
  • কর্মক্ষমতা কারণে
  • পঠনযোগ্যতা / পুনরায় ব্যবহারযোগ্যতার কারণে
  • আইডিই / সরঞ্জাম কারণে
  • ডিবাগিং কারণে
  • সবসময় একটি ভাল উপায় আছে

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

4
সত্যি বলতে গেলে, আমি মনে করি @ মাইকা রুদনিকির উত্তরটি সবচেয়ে ভাল বলেছে। আমাকে ভুল করবেন না, যখনই আমি ( নিজেকে ) একটি প্রশ্ন জিজ্ঞাসা করি এবং উত্তরটি হয় eval(), আমি শীঘ্রই ধরে নেব যে আমি প্রশ্নটি ভুল জিজ্ঞাসা করেছি; খুব কমই এটি "সঠিক" উত্তর, তবে কম্বল-রাষ্ট্রের পক্ষে এটি সর্বদাই খারাপ থাকে কেবল ভুল।
ড্যান লাগেজ

আমি যদি ডাটাবেসে কোড সঞ্চয় করতে চাই? আমি কীভাবে এটি কার্যকর করতে পারি?
কনস্ট্যান্টিন এক্সফ্ল্যাশ স্ট্র্যাটিজেনাস

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

4

আমি আপনার কোড বজায় রাখা লোকদেরও কিছুটা বিবেচনা করব।

eval () কেবল দেখার জন্য এবং কী ঘটবে বলে মনে করা সহজ উপায় নয়, আপনার উদাহরণটি তেমন খারাপ নয়, তবে অন্য জায়গাগুলিতে এটি একটি সঠিক দুঃস্বপ্ন হতে পারে।


4

ব্যক্তিগতভাবে, আমি মনে করি যে কোডটি এখনও খুব খারাপ because কারণ এটি কী করছে আপনি মন্তব্য করছেন না। এটি বৈধতার জন্য এর ইনপুটগুলিও পরীক্ষা করে না, এটি খুব ভঙ্গুর করে তোলে।

আমি আরও অনুভব করি যেহেতু 95% (বা তার বেশি) ইওল ব্যবহার সক্রিয়ভাবে বিপজ্জনক, তাই এটি অন্যান্য ক্ষেত্রে যে সামান্য সম্ভাব্য সময় সাশ্রয় করতে পারে তা ব্যবহারের খারাপ অভ্যাসে লিপ্ত হওয়ার পক্ষে উপযুক্ত নয়। এছাড়াও, আপনাকে পরে নিজের মিনিটগুলি ব্যাখ্যা করতে হবে কেন আপনার alশালের ব্যবহার ভাল এবং সেগুলি খারাপ।

এবং অবশ্যই আপনার পিএইচপি পার্লের মতো দেখতে শেষ হবে;)

ইভাল (), ("ইনজেকশন আক্রমণ" দৃশ্য হিসাবে) নিয়ে দুটি মূল সমস্যা রয়েছে:

1) এটি ক্ষতি হতে পারে 2) এটি কেবল ক্রাশ হতে পারে

এবং প্রযুক্তিগত তুলনায় আরও বেশি সামাজিক-একটি:

3) এটি অন্য কোথাও শর্টকাট হিসাবে অনুচিতভাবে এটি ব্যবহার করতে লোকেদের প্ররোচিত করবে

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

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

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

  • আপনার একটি এনাম আছে তা শনাক্ত করুন
  • অভ্যন্তরীণ তালিকাটি বের করুন
  • তালিকার মানগুলি আনপ্যাক করুন

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

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

প্রাক-রূপান্তরটির সাথে আপনার সবচেয়ে খারাপ ফলাফল সম্ভবত $ ফলাফল = নাল হতে পারে, ইওল সংস্করণটির সাথে সবচেয়ে খারাপটি অজানা, তবে কমপক্ষে একটি ক্রাশ।


3

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


3

পিএইচপি পরামর্শ দেয় যে আপনি আপনার কোডটি এমনভাবে লিখুন যাতে এটি সুস্পষ্ট প্রমাণ না দিয়ে কল_উজার_ফুনকের মাধ্যমে কার্যকর করা যায়।


2

আরেকটি কারণ evalমন্দ, যে এটি eAccelertor বা এসিপি মত পিএইচপি বাইটকোড ক্যাশে দ্বারা ক্যাশে না পারে।


2

এটি খারাপ প্রোগ্রামিং যা ফাংশন নয়, খারাপ () কে খারাপ করে তোলে। আমি এটি মাঝে মাঝে ব্যবহার করি, কারণ আমি একাধিক সাইটে গতিশীল প্রোগ্রামিংয়ে এটি পেতে পারি না। আমি কোনও সাইটে পিএইচপি পার্স করতে পারি না, কারণ আমি যা চাই তা গ্রহণ করব না। আমি ঠিক একটি ফলাফল পেতে হবে! আমি খুশি যে একটি ক্রিয়াকলাপ () উপস্থিত থাকায় এটি আমার জীবনকে আরও সহজ করে তোলে। ব্যবহারকারীর ইনপুট? শুধুমাত্র খারাপ প্রোগ্রামাররা হ্যাকারদের দ্বারা আটকানো হয়। আমি এটা নিয়ে চিন্তা করি না।


2

এটি খারাপ প্রোগ্রামিং যা ফাংশন নয়, খারাপ () কে খারাপ করে তোলে। আমি এটি মাঝে মাঝে ব্যবহার করি, কারণ আমি একাধিক সাইটে গতিশীল প্রোগ্রামিংয়ে এটি পেতে পারি না। আমি কোনও সাইটে পিএইচপি পার্স করতে পারি না, কারণ আমি যা চাই তা গ্রহণ করব না। আমি ঠিক একটি ফলাফল পেতে হবে! আমি খুশি যে একটি ক্রিয়াকলাপ () উপস্থিত থাকায় এটি আমার জীবনকে আরও সহজ করে তোলে। ব্যবহারকারীর ইনপুট? শুধুমাত্র খারাপ প্রোগ্রামাররা হ্যাকারদের দ্বারা আটকানো হয়। আমি এটা নিয়ে চিন্তা করি না।

আমি ভবিষ্যদ্বাণী করছি শীঘ্রই আপনার গুরুতর সমস্যা হবে ...

সমস্ত সততার ক্ষেত্রে, পিএইচপি-র মতো ব্যাখ্যাযোগ্য ভাষায় ইওল-এর মতো অতিরঞ্জিত ক্রিয়াকলাপের জন্য একেবারেই ভাল ব্যবহার নেই। আমি কখনও এভাল পারফর্ম অনুষ্ঠান কার্য সম্পাদন করতে দেখিনি যা অন্য, সুরক্ষিত উপায়ে ব্যবহার করে কার্যকর করা যায় না ...

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

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


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

"ইওল এর মতো অতিরঞ্জনীয় ফাংশনের জন্য একেবারেই ভাল ব্যবহার নেই" -> যে কেউ 'একেবারে' এর মতো শব্দ ব্যবহার করতে পারে সে প্রোগ্রামিংয়ে নতুন বা খারাপ প্রোগ্রামার mer
একতা 100

2

এখানে ডেভেলপিস থেকে eval ব্যবহার না করে টানা পিএইচপি কোড চালানোর একটি সমাধান রয়েছে। স্কোপ ফাংশন এবং ব্যতিক্রম সকলের জন্য অনুমতি দেয়:

$rowId=1;  //database row id
$code="echo 'hello'; echo '\nThis is a test\n'; echo date(\"Y-m-d\");"; //php code pulled from database

$func="func{$rowId}";

file_put_contents('/tmp/tempFunction.php',"<?php\nfunction $func() {\n global \$rowId;\n$code\n}\n".chr(63).">");

include '/tmp/tempFunction.php';
call_user_func($func);
unlink ('/tmp/tempFunction.php');

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


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

1

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

একটি স্ট্যাটিক কল সম্পাদন করতে আপনার কলব্যাকটিকে অ্যারে ('শ্রেণি_নাম', 'পদ্ধতি_নাম'), বা এমনকি 'শ্রেণি_নাম :: পদ্ধতি_নাম' এর মতো সাধারণ স্ট্রিং হিসাবে তৈরি করুন। ডায়নামিক কল করার জন্য অ্যারে ($ অবজেক্ট, 'পদ্ধতি') স্টাইলের কলব্যাক ব্যবহার করুন।

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


0

সুরক্ষা সংক্রান্ত উদ্বেগ ব্যতীত, ইভাল () সংকলন, অনুকূলিত বা অপকড ক্যাশে করা যায় না, সুতরাং এটি পিএইচপি কোডের তুলনায় স্বাভাবিকভাবে ধীর - উপায় ধীরে ধীরে হবে । যদিও এটি এটিকে খারাপ করে না, তবুও এটি ওয়াল ব্যবহার করা অ-অভিনয়যোগ্য is ( gotoখারাপ, evalএটি কেবল খারাপ অভ্যাস / দুর্গন্ধযুক্ত কোড / কুৎসিত)


evalএর চেয়ে কম মন্দ রেটিং পেয়েছে goto? এটা কি বিপরীত দিন?
জেএলআরিশ 13

এটি কেবলমাত্র goto5.3-এ বাস্তবায়নের জন্য আমি পিএইচপি ডিভাসের বিরুদ্ধে ক্ষোভ পোষণ করেছি ।
অ্যারন সিডারহোলম

4
নাহ, টু- gotoফোবিয়ান: এখানে সরঞ্জামগুলি রয়েছে এবং কারিগররাও রয়েছে, যারা সেগুলি ব্যবহার করেন (বা না)। ভুল করার সময় এটি এমন কোনও সরঞ্জাম নয় যা কোনও পেশাদারকে বোকাদের মতো দেখায়, বরং সঠিক সরঞ্জামগুলি (সঠিকভাবে) ব্যবহারে অক্ষম হয়। তবে এটি সবসময় দোষারোপ করার সরঞ্জাম ...
এসজেড

0

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

আমার কাছে সবচেয়ে খারাপ দিকটি হ'ল এটি আপনার কোডের রক্ষণাবেক্ষণকে হ্রাস করে :

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