Filtered Unserialize হল একটি গুরুত্বপূর্ণ নিরাপত্তা কৌশল যা PHP তে unserialize() ফাংশন ব্যবহার করার সময় নিরাপদ ডেটা হ্যান্ডলিং নিশ্চিত করতে ব্যবহৃত হয়। unserialize() একটি PHP ফাংশন যা স্ট্রিং থেকে পিএইচপি ডেটা স্ট্রাকচার (যেমন অ্যারে বা অবজেক্ট) পুনরুদ্ধার করতে ব্যবহৃত হয়। তবে, এটি যদি অনিরাপদ উপায়ে ব্যবহার করা হয়, তবে object injection (অবজেক্ট ইনজেকশন) আক্রমণ এবং অন্যান্য নিরাপত্তা ঝুঁকি তৈরি করতে পারে। এই ধরনের আক্রমণগুলি একটি হ্যাকারকে ডেটা স্ট্রাকচার পুনরুদ্ধারের সময় অপ্রত্যাশিত কোড চালানোর সুযোগ দিতে পারে।
Filtered Unserialize দ্বারা আমরা unserialize() ফাংশনটি ব্যবহার করার সময় নিরাপত্তা ঝুঁকি কমিয়ে নিরাপদ ডেটা হ্যান্ডলিং নিশ্চিত করতে পারি।
unserialize() এবং নিরাপত্তা
PHP এর unserialize() ফাংশনটি এমনভাবে কাজ করে যে এটি যেকোনো ধরনের পিএইচপি অবজেক্ট এবং অ্যারে পুনরুদ্ধার করতে সক্ষম। তবে, যেহেতু এটি অবজেক্ট রিকন্সট্রাক্ট করতে পারে, তাই এটি নিরাপত্তা ঝুঁকি তৈরি করতে পারে যদি:
- Untrusted Input: যদি ইউজার থেকে ইনপুট আসলে কোনো অবজেক্ট বা অ্যারে স্ট্রিং থাকে যা নিরাপত্তা ঝুঁকি তৈরি করতে পারে।
- Object Injection: একটি অ্যাটাকারের তৈরি অবজেক্ট ইনজেক্ট করা এবং অপ্রত্যাশিত কোড বা কার্যকলাপ চালানো।
এই সমস্যাগুলি এড়ানোর জন্য Filtered Unserialize ব্যবহার করা হয়, যেখানে আমরা allowed_classes প্রপার্টি ব্যবহার করে নিরাপদ অবজেক্টের ক্লাসগুলি সীমাবদ্ধ করি।
Filtered Unserialize এর মাধ্যমে নিরাপদ Data Handling
PHP 7.0 এবং পরবর্তী সংস্করণে, unserialize() ফাংশনটি নিরাপত্তা উন্নত করার জন্য allowed_classes নামক একটি বিকল্প যোগ করেছে। এটি ব্যবহারের মাধ্যমে আপনি কী ধরনের ক্লাস পুনরুদ্ধার করতে চান তা নির্দিষ্ট করতে পারেন, এবং যেকোনো অবৈধ ক্লাস ইনজেকশন প্রতিরোধ করতে পারেন।
allowed_classes বিকল্প ব্যবহার:
<?php
$data = 'O:8:"ExampleClass":1:{s:4:"data";s:5:"Hello";}';
// Unserialize with allowed_classes filter
$unserializedData = unserialize($data, ["allowed_classes" => ["ExampleClass"]]);
var_dump($unserializedData); // আউটপুট হবে: object(ExampleClass)#1 (1) { ["data"]=> string(5) "Hello" }
?>এখানে, allowed_classes এর মাধ্যমে শুধুমাত্র ExampleClass ক্লাসের অবজেক্ট রিকন্সট্রাক্ট করা হয়েছে, এবং অন্য কোনো ক্লাসের অবজেক্ট পুনরুদ্ধার করার চেষ্টা করা হলে তা ব্লক হয়ে যাবে। এই ফিচারটি object injection আক্রমণ প্রতিরোধে সহায়ক।
১. Unserialize Without Any Classes
যদি আপনি সম্পূর্ণভাবে অবজেক্ট ইনজেকশন এড়াতে চান এবং শুধুমাত্র অ্যারে বা বেসিক ডেটা টাইপগুলিই অনুমোদন করতে চান, তবে আপনি allowed_classes বিকল্পটি false হিসেবে সেট করতে পারেন।
<?php
$data = 'a:1:{i:0;s:5:"Hello";}';
// Unserialize without allowing any classes
$unserializedData = unserialize($data, ["allowed_classes" => false]);
var_dump($unserializedData); // আউটপুট হবে: array(1) { [0]=> string(5) "Hello" }
?>এখানে, allowed_classes => false সেট করা হয়েছে, যার মানে হচ্ছে অবজেক্ট ক্লাস পুনরুদ্ধারের অনুমতি নেই, কেবল অ্যারে বা স্ট্রিংসহ অন্যান্য বেসিক ডেটা প্রকারগুলি অনুমোদিত থাকবে।
২. Object Injection Prevention Using allowed_classes
Object injection আক্রমণ থেকে রক্ষা পাওয়ার জন্য allowed_classes বিকল্পের সঠিক ব্যবহার খুবই গুরুত্বপূর্ণ।
<?php
// Attacker data with an unserialized object
$maliciousData = 'O:8:"MaliciousClass":1:{s:4:"data";s:6:"attack";}';
// Allow only trusted classes
$unserializedData = unserialize($maliciousData, ["allowed_classes" => ["TrustedClass"]]);
// This will throw an exception or error
var_dump($unserializedData);
?>এখানে, allowed_classes => ["TrustedClass"] শুধুমাত্র TrustedClass ক্লাসের অবজেক্ট অনুমোদন করছে, যা অবৈধ বা ম্যালওয়্যার ক্লাসগুলির প্রবাহ ঠেকাতে সহায়ক।
৩. Error Handling with Filtered Unserialize
Filtered Unserialize ব্যবহার করার সময়, কোনো অবৈধ ক্লাস উপস্থিত থাকলে unserialize() একটি Exception বা Warning ছুড়ে দিতে পারে। তাই এই ধরনের ভুল ধরা খুবই গুরুত্বপূর্ণ। নিচে উদাহরণ দেয়া হলো:
<?php
$data = 'O:8:"MaliciousClass":1:{s:4:"data";s:6:"attack";}';
// Trying to unserialize with allowed_classes filter
try {
$unserializedData = unserialize($data, ["allowed_classes" => ["TrustedClass"]]);
} catch (Exception $e) {
echo "Error: " . $e->getMessage(); // Handle error gracefully
}
?>এখানে, যদি MaliciousClass অবজেক্ট ইনজেক্ট করা হয়, তাহলে Exception বা Warning প্রকাশিত হবে এবং তা সঠিকভাবে হ্যান্ডল করা যেতে পারে।
সারসংক্ষেপ
Filtered Unserialize PHP তে safe deserialization নিশ্চিত করার একটি কার্যকর পদ্ধতি। এটি allowed_classes বিকল্পের মাধ্যমে শুধুমাত্র নির্দিষ্ট ক্লাসের অবজেক্ট অনুমোদন করে এবং অবৈধ ক্লাস ইনজেকশন প্রতিরোধ করে, যার মাধ্যমে object injection আক্রমণ এড়ানো যায়। এটি PHP 7.0 এবং পরবর্তী সংস্করণে উপলব্ধ, এবং নিরাপত্তা বাড়াতে unserialize() ফাংশনের একটি অপরিহার্য অংশ।