পরবর্তী মানটি অনুমান করার ক্ষমতাটি rand
যা srand
ডাকা হয়েছিল তা নির্ধারণ করতে সক্ষম হওয়ার সাথে আবদ্ধ । বিশেষত, পূর্বনির্ধারিত সংখ্যার সাথে বপনের srand
ফলে ভবিষ্যদ্বাণীযোগ্য ফলাফল হয় ! পিএইচপি ইন্টারেক্টিভ প্রম্পট থেকে:
[charles@charles-workstation ~]$ php -a
Interactive shell
php > srand(1024);
php > echo rand(1, 100);
97
php > echo rand(1, 100);
97
php > echo rand(1, 100);
39
php > echo rand(1, 100);
77
php > echo rand(1, 100);
93
php > srand(1024);
php > echo rand(1, 100);
97
php > echo rand(1, 100);
97
php > echo rand(1, 100);
39
php > echo rand(1, 100);
77
php > echo rand(1, 100);
93
php >
এটি কেবল কিছু সাবলীল নয়। সর্বাধিক পিএইচপি সংস্করণ * সবচেয়ে প্ল্যাটফর্মের উপর ** ক্রম 97, 97, 39, 77, 93 যখন উত্পন্ন করবে srand
'ঘ 1024 সঙ্গে।
স্পষ্ট করে বলতে গেলে, এটি পিএইচপি নিয়ে সমস্যা নয়, এটি rand
নিজেই বাস্তবায়নের ক্ষেত্রে সমস্যা a পার্ল সহ একই ভাষা (বা একই জাতীয়) বাস্তবায়ন ব্যবহারকারী অন্যান্য ভাষায় একই সমস্যা দেখা দেয়।
কৌশলটি হ'ল পিএইচপি-এর যে কোনও বুদ্ধিমান সংস্করণ srand
একটি "অজানা" মান সহ প্রাক-বীজযুক্ত হবে । ওহ, তবে এটি আসলে অজানা নয়। থেকে ext/standard/php_rand.h
:
#define GENERATE_SEED() (((long) (time(0) * getpid())) ^ ((long) (1000000.0 * php_combined_lcg(TSRMLS_C))))
সুতরাং, এটি time()
পিআইডি এবং এর ফলাফলগুলির সাথে কিছু গণিত php_combined_lcg
, যা সংজ্ঞায়িত হয়েছে ext/standard/lcg.c
। আমি এখানে সি & পি করতে যাচ্ছি না, পাশাপাশি, আমার চোখও ঝলমলে হয়ে গেছে এবং আমি শিকার বন্ধ করার সিদ্ধান্ত নিয়েছি।
কিছুটা গুগলিং দেখায় যে পিএইচপি-র অন্যান্য ক্ষেত্রগুলির মধ্যে এলোমেলো প্রজন্মের সেরা বৈশিষ্ট্য নেই , এবং php_combined_lcg
এখানে দাঁড়ানোর জন্য কলগুলি বিশেষত বিশ্লেষণের এই:
এই ফাংশনটি ( gettimeofday
) কেবল রূপালী প্লেটারে আমাদের একটি সুনির্দিষ্ট সার্ভার টাইমস্ট্যাম্পকে ফিরিয়ে দেয় না , এটি এলসিজি আউটপুটেও যুক্ত করে যদি আমরা "আরও এনট্রপি" (পিএইচপি'র uniqid
) অনুরোধ করি।
হ্যাঁ যেuniqid
। দেখে মনে php_combined_lcg
হয় যে আমরা uniqid
দ্বিতীয় যুক্তিটির সাথে সত্যিকারের মান সেট করে কল করার পরে ফলাফলের হেক্স্স সংখ্যাগুলি দেখি তখন এর মান আমরা দেখতে পাই ।
এখন, আমরা কোথায় ছিলাম?
হ্যাঁ. srand
।
সুতরাং, আপনি যে কোডটি থেকে এলোমেলো মানগুলির পূর্বাভাস দেওয়ার চেষ্টা করছেন সেগুলি যদি কল না করে তবেsrand
আপনি যে কলটি দিয়েছিলেন php_combined_lcg
(পরোক্ষভাবে?) পেতে পারেন তার সরবরাহকৃত মানটি নির্ধারণ করতে হবে uniqid
। সেই মানটি হাতে রেখে, বাকী মান - পিআইডি এবং কিছু গণিতকে জোর করে চাপানো সম্ভব as time()
সংযুক্ত সুরক্ষা সমস্যাটি সেশন ভাঙ্গার বিষয়ে, তবে একই কৌশলটি এখানে কাজ করবে। আবার, নিবন্ধ থেকে:
উপরে বর্ণিত আক্রমণের পদক্ষেপগুলির সংক্ষিপ্তসার এখানে:
- সার্ভারটি পুনরায় বুট করার জন্য অপেক্ষা করুন
- একটি অদ্বিতীয় মান আনুন
- এ থেকে আরএনজি বীজকে জোর করে চাপিয়ে দিন
- লক্ষ্য উপস্থিত হওয়ার জন্য অপেক্ষা করতে অনলাইন স্থিতিটি পোল করুন
- বর্তমান সার্ভার সময় এবং আরএনজি মান ট্র্যাক রাখতে ইউনিকিড পোলের সাথে ইন্টারলিভ স্থিতি পোলগুলি
- ভোটগ্রহণে প্রতিষ্ঠিত সময় এবং আরএনজি মান ব্যবধান ব্যবহার করে সার্ভারের বিরুদ্ধে ব্রুট ফোর্স সেশন আইডি
প্রয়োজন অনুসারে কেবল সেই শেষ পদক্ষেপটি প্রতিস্থাপন করুন।
(বর্তমানে সুরক্ষার তুলনায় এই সুরক্ষা ইস্যুটি আমাদের পূর্ববর্তী পিএইচপি সংস্করণে (5.3.2) রিপোর্ট করা হয়েছিল, সুতরাং এটি সম্ভবত সম্ভব যে এর আচরণ uniqid
এবং / অথবা php_combined_lcg
পরিবর্তিত হয়েছে, সুতরাং এই নির্দিষ্ট কৌশলটি আর কার্যকর হয় না। YMMV।)
অন্যদিকে, আপনি যদি কোডটি ম্যানুয়ালি কলsrand
করার চেষ্টা করছেন তবে যদি তারা ফলাফলটির চেয়ে বহুগুণ ভাল কিছু ব্যবহার না করে তবে php_combined_lcg
আপনি সম্ভবত মানটি নির্ধারণ করতে এবং আপনার স্থানীয়কে বীজ করার জন্য আরও সহজ সময় পেতে যাচ্ছেন সঠিক নম্বর সহ জেনারেটর। ম্যানুয়ালি কল করা বেশিরভাগ লোকেরা srand
ধারণাটি বুঝতে পারে না যে এটি কতটা ভয়ঙ্কর ধারণা, এবং এভাবে আরও ভাল মানের ব্যবহার করার সম্ভাবনা নেই।
এটি লক্ষণীয় যে mt_rand
এটি একই সমস্যা দ্বারাও আক্রান্ত। mt_srand
একটি পরিচিত মান সঙ্গে বপন এছাড়াও অনুমানযোগ্য ফলাফল দিতে হবে। আপনার এন্ট্রপি বন্ধ বন্ধ openssl_random_pseudo_bytes
সম্ভবত একটি নিরাপদ বাজি।
tl; dr: সর্বোত্তম ফলাফলের জন্য, পিএইচপি র্যান্ডম নম্বর জেনারেটরটি বদ্ধ করবেন না এবং ভালোর জন্য, uniqid
ব্যবহারকারীর সামনে প্রকাশ করবেন না । এই দুটি বা উভয়টি করার ফলে আপনার এলোমেলো সংখ্যা আরও অনুমানযোগ্য হতে পারে।
পিএইচপি 7 এর জন্য আপডেট করুন:
পিএইচপি 7.0 প্রবর্তন random_bytes
এবং random_int
কোর ফাংশন হিসাবে। এগুলি অন্তর্নিহিত সিস্টেমের সিএসপিআরএনজি বাস্তবায়ন ব্যবহার করে, বীজযুক্ত এলোমেলো নম্বর জেনারেটরের যে সমস্যাগুলি তা থেকে তাদের মুক্ত করে। এগুলি openssl_random_pseudo_bytes
কেবল ইনস্টল করার জন্য কোনও এক্সটেনশনের প্রয়োজন ছাড়াই কার্যকরভাবে এর মতো । একটি পলিফিল পিএইচপি 5 এর জন্য উপলব্ধ ।
*: সুহসিন সুরক্ষা প্যাচ এর আচরণ rand
এবং mt_rand
এমন পরিবর্তন করে যে তারা সর্বদা প্রতিটি কল দিয়ে পুনরায় বীজ বপন করে। সুহসিন একটি তৃতীয় পক্ষ দ্বারা সরবরাহ করা হয়। কিছু লিনাক্স ডিস্ট্রিবিউশনগুলি এটিকে ডিফল্টরূপে তাদের অফিসিয়াল পিএইচপি প্যাকেজগুলিতে অন্তর্ভুক্ত করে, অন্যরা এটির বিকল্প তৈরি করে এবং অন্যরা এটি সম্পূর্ণ উপেক্ষা করে।
**: প্ল্যাটফর্ম এবং অন্তর্নিহিত লাইব্রেরি কলগুলি ব্যবহার করা হচ্ছে তার উপর নির্ভর করে এখানে ডকুমেন্টের তুলনায় বিভিন্ন সিকোয়েন্স তৈরি করা হবে তবে সুহসিন প্যাচ ব্যবহার না করা হলে ফলাফলগুলি পুনরাবৃত্তিযোগ্য হওয়া উচিত।