Filtered Unserialize (ফিল্টার্ড আনসিরিয়ালাইজ) PHP 7 এবং পরবর্তী সংস্করণে একটি গুরুত্বপূর্ণ বৈশিষ্ট্য যা unserialize() ফাংশনের মাধ্যমে ডেটা আনসিরিয়ালাইজ করার সময় নিরাপত্তা বাড়াতে ব্যবহৃত হয়। এটি মূলত বিকল্প হিসেবে নিরাপদ "unserialize" প্রক্রিয়া তৈরি করতে সহায়ক, যাতে কোনো ধরনের অপ্রত্যাশিত আক্রমণ বা দুর্বলতা (যেমন object injection বা remote code execution) এড়ানো যায়।
unserialize() ফাংশনটি সিরিয়ালাইজ করা ডেটাকে PHP ভেরিয়েবলে রূপান্তর করে, কিন্তু এটি ব্যবহার করার সময় কিছু নিরাপত্তা ঝুঁকি তৈরি হতে পারে। যেহেতু unserialize() কোন অবজেক্ট বা কাস্টম ক্লাসের ইনস্ট্যান্স তৈরি করতে পারে, তাই আক্রমণকারীরা এই ফাংশনের মাধ্যমে বিপজ্জনক অবজেক্ট ইনজেকশন করতে পারে। Filtered Unserialize এর মাধ্যমে এই ধরনের নিরাপত্তা ঝুঁকি কমানো যায়।
Filtered Unserialize কী?
Filtered Unserialize এর মাধ্যমে আপনি unserialize() ফাংশন ব্যবহারের সময় কিছু নির্দিষ্ট ফিল্টার বা সীমাবদ্ধতা আরোপ করতে পারেন, যাতে শুধুমাত্র নিরাপদ এবং অনুমোদিত ক্লাস বা অবজেক্ট ডেটার মধ্যে আনসিরিয়ালাইজেশন করা হয়। এই ফিচারটি allowed_classes প্যারামিটার ব্যবহার করে নিরাপদ ক্লাসের তালিকা নির্ধারণ করতে সহায়ক।
unserialize() ফাংশন এবং allowed_classes
PHP 7 থেকে unserialize() ফাংশনটির একটি নতুন প্যারামিটার allowed_classes যোগ করা হয়েছে, যা ডেটা আনসিরিয়ালাইজ করার সময় অনুমোদিত ক্লাসগুলি নির্ধারণ করতে ব্যবহৃত হয়। আপনি এই প্যারামিটারটি ব্যবহার করে অবজেক্ট ইনজেকশন আক্রমণ প্রতিরোধ করতে পারেন।
allowed_classes: এটি একটি প্যারামিটার যা ক্লাসের একটি অ্যারে গ্রহণ করে, যার মাধ্যমে আপনি শুধুমাত্র নির্দিষ্ট ক্লাসগুলির অবজেক্ট আনসিরিয়ালাইজ করতে অনুমতি দেন।
উদাহরণ: Filtered Unserialize ব্যবহার করা
<?php
$data = 'O:8:"MyClass":0:{}'; // একটি সিরিয়ালাইজ করা অবজেক্ট
// ফিল্টার্ড আনসিরিয়ালাইজেশন: শুধুমাত্র MyClass ক্লাসের অবজেক্ট আনসিরিয়ালাইজ করা হবে
$obj = unserialize($data, ["allowed_classes" => ["MyClass"]]);
echo get_class($obj); // আউটপুট হবে: MyClass
?>এখানে, allowed_classes প্যারামিটারটি নির্দিষ্ট করে দেয় যে শুধুমাত্র MyClass ক্লাসের অবজেক্টই আনসিরিয়ালাইজ করা যাবে। যদি সিরিয়ালাইজ করা ডেটাতে অন্য কোনো ক্লাসের অবজেক্ট থাকে, তবে unserialize() ত্রুটি ছুড়ে দিবে।
উদাহরণ: শুধুমাত্র নির্দিষ্ট ক্লাসের অবজেক্ট অনুমোদন
<?php
$data = 'O:8:"AnotherClass":0:{}'; // একটি সিরিয়ালাইজ করা অবজেক্ট
// ফিল্টার্ড আনসিরিয়ালাইজেশন: শুধুমাত্র MyClass ক্লাসের অবজেক্ট আনসিরিয়ালাইজ করা হবে
$obj = unserialize($data, ["allowed_classes" => ["MyClass"]]);
// যদি এটি অন্য ক্লাসের অবজেক্ট হয়, তাহলে NULL রিটার্ন করবে
var_dump($obj); // আউটপুট হবে: NULL
?>এখানে, allowed_classes প্যারামিটারটি "MyClass" ক্লাসটিকে অনুমোদন দিয়েছে, কিন্তু AnotherClass ক্লাসটি allowed_classes তালিকায় না থাকায় অবজেক্ট আনসিরিয়ালাইজেশন ব্যর্থ হয়েছে এবং NULL রিটার্ন করেছে।
Filtered Unserialize এর সুবিধা
- অবজেক্ট ইনজেকশন আক্রমণ প্রতিরোধ: Filtered Unserialize এর মাধ্যমে আপনি শুধু অনুমোদিত ক্লাসগুলির অবজেক্ট আনসিরিয়ালাইজ করতে পারবেন, যার ফলে অবজেক্ট ইনজেকশন আক্রমণের ঝুঁকি কমে যায়।
- নিরাপত্তা বৃদ্ধি:
allowed_classesব্যবহার করে আপনি কোডে বিপজ্জনক অবজেক্ট বা ক্লাস ইনজেকশন প্রতিরোধ করতে পারেন, যা PHP স্ক্রিপ্টের নিরাপত্তা বাড়ায়। - বিশেষ ধরনের অবজেক্ট ব্যান: আপনি যে ক্লাসগুলির অবজেক্ট ব্যবহার করতে চান না, সেগুলি নিষিদ্ধ করতে পারেন। এটি কোডের অপ্রত্যাশিত বা অননুমোদিত কার্যকলাপ রোধ করতে সহায়ক।
- সহজ কনফিগারেশন:
allowed_classesপ্যারামিটারটি খুবই সহজভাবে ব্যবহার করা যায় এবং এটি কোডের নিরাপত্তা বাড়াতে খুব কার্যকরী।
Filtered Unserialize এর সীমাবদ্ধতা
- কেবলমাত্র PHP 7+ এ উপলব্ধ:
allowed_classesপ্যারামিটারটি PHP 7 এবং তার পরবর্তী সংস্করণে উপলব্ধ। পুরানো PHP সংস্করণে এটি কাজ করবে না। - বিশেষভাবে অনুমোদিত ক্লাসের তালিকা তৈরি করা: যখন আপনি বিভিন্ন ক্লাসের অবজেক্ট সিরিয়ালাইজ করতে চান, তখন সেগুলি
allowed_classesপ্যারামিটারটি দিয়ে নির্দিষ্ট করতে হয়, যা কিছুটা জটিল হতে পারে।
Filtered Unserialize ব্যবহার করার ভালো প্র্যাকটিস
- যতটা সম্ভব
allowed_classesব্যবহার করুন: নিরাপত্তার জন্য সর্বদাallowed_classesব্যবহার করা উচিত। এটা নিশ্চিত করবে যে শুধুমাত্র নিরাপদ ক্লাসের অবজেক্ট গুলি আনসিরিয়ালাইজড হবে। - অপ্রয়োজনীয় ক্লাসগুলো নিষিদ্ধ করুন: যে ক্লাসগুলো আপনার কোডে অবজেক্ট ইনজেকশন বা খারাপ আচরণ করতে পারে, সেগুলি নিষিদ্ধ করে রাখুন।
- নিরাপদ এবং সঠিক ইনপুট যাচাই করা: যখন আপনি
unserialize()ফাংশন ব্যবহার করেন, তখন নিশ্চিত করুন যে ইনপুট ডেটাটি নিরাপদ এবং সঠিক উৎস থেকে এসেছে।
সারসংক্ষেপ
Filtered Unserialize PHP 7-এ একটি গুরুত্বপূর্ণ নিরাপত্তা বৈশিষ্ট্য, যা unserialize() ফাংশন ব্যবহার করার সময় অবজেক্ট ইনজেকশন আক্রমণ থেকে রক্ষা করতে সহায়ক। allowed_classes প্যারামিটারটি ব্যবহার করে আপনি নিশ্চিত করতে পারেন যে শুধুমাত্র নির্দিষ্ট ক্লাসের অবজেক্টই আনসিরিয়ালাইজ করা হবে, যা PHP স্ক্রিপ্টের নিরাপত্তা বৃদ্ধি করে। এটি এমন একটি নিরাপদ পদ্ধতি যা আপনার কোডের অবজেক্ট ইনজেকশন আক্রমণ থেকে সুরক্ষা দেয়।
PHP তে unserialize() ফাংশনটি একটি স্ট্রিং ডেটা পুনরায় PHP অবজেক্ট বা অ্যারের মধ্যে রূপান্তর করার জন্য ব্যবহৃত হয়। এটি সাধারণত স্টোরেজ বা সেশনে ডেটা পুনরুদ্ধার করতে ব্যবহৃত হয়। তবে, unserialize() ব্যবহারে কিছু নিরাপত্তা ঝুঁকি থাকতে পারে, বিশেষ করে যদি আপনি অবিশ্বাস্য বা আক্রমণকারী উৎস থেকে ডেটা আনসিরিয়ালাইজ করতে থাকেন।
যেহেতু unserialize() ফাংশনটি অবজেক্ট ইনজেকশন বা ক্লাস ম্যানিপুলেশন আক্রমণগুলিকে সহ্য করতে পারে, সুতরাং এটি নিরাপত্তা সম্পর্কে সচেতনভাবে ব্যবহৃত হওয়া উচিত।
unserialize() এর নিরাপত্তা ঝুঁকি
- অবজেক্ট ইনজেকশন (Object Injection):
অবিশ্বাস্য বা অপূর্ণাঙ্গ ডেটা গ্রহণ করার মাধ্যমে আক্রমণকারী একটি অবজেক্ট ইনজেক্ট করতে পারে যা কোডের নিরাপত্তা ক্ষতিগ্রস্ত করে। এতে, আক্রমণকারী ক্লাসের পদ্ধতিতে অ্যাক্সেস পেতে পারে যা ম্যালিসিয়াস কার্যকলাপ যেমন ফাইল ব্যবস্থাপনা বা ডাটাবেস ক্রিয়াকলাপকে প্ররোচিত করতে পারে। - ক্লাস ম্যানিপুলেশন:
অবজেক্ট ইনজেকশন আক্রমণকারীদের জন্য এটি একটি সুযোগ প্রদান করে যাতে তারা কোডের ব্যবহৃত ক্লাসের আচরণ পরিবর্তন করতে পারে, অথবা তারা প্রোগ্রামিংয়ের নির্দিষ্ট জায়গায় অবৈধ কার্যক্রম চালাতে পারে।
unserialize() ফাংশনের নিরাপত্তা উন্নয়ন
allowed_classesপ্যারামিটার ব্যবহার করা:
PHP 7.0.0 থেকে,unserialize()ফাংশনে একটিallowed_classesপ্যারামিটার যোগ করা হয়েছে, যা নিরাপত্তা বৃদ্ধি করতে সহায়ক। এই প্যারামিটারটি ব্যবহার করে আপনি কী কী ক্লাস ডেটার মাধ্যমে পুনরুদ্ধার করা যাবে তা সীমাবদ্ধ করতে পারেন।allowed_classesপ্যারামিটারটিfalseকরলে, সমস্ত ক্লাস ইনজেকশন নিষিদ্ধ হবে।- আপনি নির্দিষ্ট ক্লাসের নাম বা একটি ক্লাসের অ্যারে প্রদান করে শুধুমাত্র সেগুলিকেই পুনরুদ্ধার করতে পারবেন।
উদাহরণ: allowed_classes ব্যবহার
<?php
$data = 'O:8:"MyClass":1:{s:4:"name";s:5:"test";}';
$unserializedData = unserialize($data, ["allowed_classes" => ["MyClass"]]);
// `MyClass` ছাড়া কোনো ক্লাস যদি ডেটা থেকে পুনরুদ্ধার করা হয় তবে সেটি বাধা দেবে
print_r($unserializedData);
?>এখানে, শুধুমাত্র MyClass ক্লাসের ডেটা unserialize() ফাংশনে পুনরুদ্ধার করা যাবে, অন্য কোনো ক্লাস ইনজেক্ট করা হলে তা নিষিদ্ধ হবে।
@অপারেটর ব্যবহার করা এড়ানো:
কখনোই@অপারেটর ব্যবহার করেunserialize()ফাংশনের ত্রুটিগুলি চাপুন না। এটি আক্রমণকারীদের জন্য ত্রুটি লুকানোর সুযোগ সৃষ্টি করে এবং আক্রমণটি সফল হতে পারে। এর পরিবর্তে, ত্রুটি সঠিকভাবে হ্যান্ডল করা উচিত।- নির্ভরযোগ্য উৎস থেকে ডেটা:
ডেটা পুনরুদ্ধারের আগে নিশ্চিত করুন যে,unserialize()ফাংশনের জন্য প্রাপ্ত ডেটা একটি নির্ভরযোগ্য উৎস থেকে এসেছে। যদি ডেটা অবিশ্বাস্য হয়, তাহলে এটি সরাসরিunserialize()না করে, নিরাপদ একটি ভ্যালিডেশন পদ্ধতি ব্যবহার করুন। json_decode()ব্যবহার করা:
যদি আপনি নিরাপদভাবে স্ট্রিং ডেটাকে অবজেক্ট বা অ্যারে হিসেবে ব্যবহার করতে চান, তবেunserialize()এর পরিবর্তেjson_decode()ফাংশন ব্যবহার করুন, যা সাধারণত নিরাপদ এবং অপ্রত্যাশিত ক্লাস ইনজেকশন থেকে মুক্ত।
উদাহরণ: json_decode() ব্যবহার
<?php
$data = '{"name":"test"}';
$decodedData = json_decode($data, true);
print_r($decodedData); // আউটপুট হবে: Array ( [name] => test )
?>json_decode() ফাংশনটি সাধারণ স্ট্রিং ডেটাকে অ্যারে বা অবজেক্টে রূপান্তর করতে পারে, তবে এটি কোনো ক্লাস বা অবজেক্ট ইনজেকশন সমস্যা তৈরি করে না।
serialize()এর নিরাপদ ব্যবহার:
ডেটা পুনরুদ্ধারের সময়, সর্বদা এটি নিশ্চিত করুন যে আপনি সঠিকভাবেserialize()এর মাধ্যমে ডেটা তৈরি করেছেন এবং শুধুমাত্র নিরাপদ ডেটা ব্যবহার করছেন।is_object()বাis_array()চেক করা:
আপনি যদিunserialize()এর মাধ্যমে আনা ডেটার ধরন যাচাই করতে চান, তবেis_object()বাis_array()চেক ব্যবহার করে নিশ্চিত করতে পারেন যে, অবজেক্ট বা অ্যারে আনা হয়েছে।
উদাহরণ: is_object() বা is_array() ব্যবহার
<?php
$data = unserialize($input);
if (is_object($data)) {
// Handle the object safely
} else {
// Handle invalid or unexpected data
}
?>সারসংক্ষেপ
unserialize() ফাংশনটি PHP-তে একটি গুরুত্বপূর্ণ ফাংশন যা স্ট্রিং ডেটা পুনরায় অবজেক্ট বা অ্যারে আকারে রূপান্তর করতে ব্যবহৃত হয়। তবে, এটি নিরাপত্তা ঝুঁকি তৈরি করতে পারে, বিশেষত যখন অবিশ্বাস্য উৎস থেকে ডেটা পুনরুদ্ধার করা হয়। CSPRNG, অবজেক্ট ইনজেকশন, এবং ক্লাস ম্যানিপুলেশন আক্রমণগুলিকে এড়াতে, আপনি allowed_classes প্যারামিটার ব্যবহার করে নিরাপত্তা উন্নত করতে পারেন, এবং json_decode() এর মতো নিরাপদ পদ্ধতিও ব্যবহার করতে পারেন। unserialize() ব্যবহার করার সময় সর্বদা নিরাপত্তা নিশ্চিত করতে সঠিক ভ্যালিডেশন এবং ত্রুটি হ্যান্ডলিং পদ্ধতি অনুসরণ করা উচিত।
Data Deserialization হল একটি প্রক্রিয়া যেখানে একটি স্ট্রিং বা বাইনারি ডেটা কাঠামো (যেমন JSON বা serialized PHP ডেটা) একটি কার্যকর ডেটা স্ট্রাকচার (যেমন অ্যারে বা অবজেক্ট) এ রূপান্তরিত হয়। এটি প্রায়শই serialization এর বিপরীত প্রক্রিয়া হিসেবে ব্যবহৃত হয়, যেখানে অবজেক্ট বা ডেটা স্ট্রাকচারকে স্টোর করা বা স্থানান্তরের জন্য একটি স্ট্রিং বা বাইনারি ফর্ম্যাটে রূপান্তর করা হয়।
যখন ডেটা deserialization করা হয়, তখন security vulnerabilities সৃষ্টি হতে পারে, যেমন object injection, code execution, এবং denial-of-service attacks। তাই data deserialization এর ক্ষেত্রে filtering techniques ব্যবহারের মাধ্যমে এই ঝুঁকি কমানো গুরুত্বপূর্ণ।
Data Deserialization এ Filtering Techniques
১. Whitelist Filtering
Whitelist Filtering একটি নিরাপদ পদ্ধতি, যেখানে শুধুমাত্র নির্দিষ্ট, অনুমোদিত ক্লাস বা ডেটা টাইপগুলিকে অনুমোদন করা হয়। এটি deserialization এর সময় নিরাপত্তা নিশ্চিত করার একটি প্রাথমিক পদ্ধতি।
উদাহরণ:
<?php
class Car {
public $model;
public $brand;
}
class Bike {
public $type;
public $brand;
}
$allowed_classes = ['Car'];
$data = unserialize($input, ["allowed_classes" => $allowed_classes]);
?>এখানে, unserialize() ফাংশনে allowed_classes অ্যারে ব্যবহার করা হয়েছে, যেখানে শুধুমাত্র Car ক্লাসের ইনস্ট্যান্স ডেসিরিয়ালাইজ করার অনুমতি দেওয়া হচ্ছে। Bike ক্লাস বা অন্য কোনো অবজেক্ট ডেসিরিয়ালাইজ করা হবে না।
২. Type Checking
Type checking ব্যবহার করে আপনি unserialize() ফাংশন ব্যবহার করার আগে ডেটার ধরন যাচাই করতে পারেন। এটি নিরাপদভাবে deserialization এর আগে ডেটা যাচাই করার জন্য ব্যবহৃত হয়।
উদাহরণ:
<?php
$data = unserialize($input);
// Type checking
if (!is_object($data) || !($data instanceof AllowedClass)) {
throw new Exception("Invalid data");
}
?>এখানে, ডেসিরিয়ালাইজড ডেটা যাচাই করা হচ্ছে যে এটি একটি অবজেক্ট এবং অনুমোদিত ক্লাসের অংশ কিনা। যদি এটি সঠিক না হয়, তাহলে একটি Exception ছুড়ে দেওয়া হবে।
৩. Regular Expression Filtering
ডেটা যাচাই করতে regular expressions ব্যবহার করা হতে পারে, বিশেষ করে যখন ডেটা স্ট্রিং বা ইনপুট ভেরিফিকেশন করার প্রয়োজন হয়। এই পদ্ধতি ব্যবহার করে আপনি সুনির্দিষ্ট ধরনের ডেটা যেমন ভ্যালিড স্ট্রিং, ফাইল পাথ, অথবা ইউআরএল ফিল্টার করতে পারেন।
উদাহরণ:
<?php
$pattern = "/^[a-zA-Z0-9]+$/"; // Alphanumeric characters only
// Validate input string
if (preg_match($pattern, $input)) {
$data = unserialize($input);
} else {
throw new Exception("Invalid input data");
}
?>এখানে, ইনপুট ডেটা শুধুমাত্র alphanumeric characters সম্বলিত কিনা যাচাই করা হচ্ছে। যদি না হয়, তবে একটি ত্রুটি ছুড়ে দেওয়া হচ্ছে।
৪. Depth Limiting
ডেসিরিয়ালাইজেশন প্রক্রিয়ায় ডেটার গভীরতা (depth) নির্ধারণ করা একটি গুরুত্বপূর্ণ নিরাপত্তা পদক্ষেপ। কিছু আক্রমণকারী ডেটার গভীরতা বাড়িয়ে denial of service (DoS) আক্রমণ করতে পারে, যেমন stack overflow।
উদাহরণ:
<?php
$options = [
"max_depth" => 5 // Limit maximum depth to 5 levels
];
$data = unserialize($input, $options);
?>এখানে, max_depth বিকল্প ব্যবহার করে ডেটার গভীরতা সীমাবদ্ধ করা হয়েছে যাতে অত্যধিক গভীরতার denial of service আক্রমণ প্রতিরোধ করা যায়।
৫. Using Secure Serialization Libraries
PHP তে secure deserialization নিশ্চিত করার জন্য নির্ভরযোগ্য এবং নিরাপদ লাইব্রেরি ব্যবহার করা একটি ভাল ধারণা। যেমন json_decode() এবং json_encode() এর মাধ্যমে JSON ডেটা সুরক্ষিতভাবে deserialization করা যেতে পারে, যা serialization এর তুলনায় অধিক নিরাপদ।
উদাহরণ:
<?php
$data = json_decode($input, true); // Decode JSON safely
if (json_last_error() != JSON_ERROR_NONE) {
throw new Exception("Invalid JSON data");
}
?>এখানে, json_decode() ব্যবহার করা হয়েছে যা JSON ডেটা সুরক্ষিতভাবে ডেসিরিয়ালাইজ করে। JSON ডেটা সঠিকভাবে ডেসিরিয়ালাইজ না হলে একটি Exception ছুড়ে দেওয়া হবে।
৬. Object Injection Protection
Object Injection আক্রমণের বিরুদ্ধে সুরক্ষা নিশ্চিত করার জন্য কিছু অতিরিক্ত নিরাপত্তা পদ্ধতি গ্রহণ করা যেতে পারে। যেমন, unserialize() ফাংশনে allowed_classes বিকল্প ব্যবহার করা, যা শুধুমাত্র নির্দিষ্ট ক্লাসের অবজেক্ট ডেসিরিয়ালাইজ করতে অনুমতি দেয়।
উদাহরণ:
<?php
$input = unserialize($data, ["allowed_classes" => ["MyClass"]]);
?>এখানে, শুধুমাত্র MyClass ক্লাসের অবজেক্ট ডেসিরিয়ালাইজ করার অনুমতি দেওয়া হচ্ছে, অন্য কোন অবজেক্ট ডেসিরিয়ালাইজ করা যাবে না।
সারসংক্ষেপ
Data Deserialization একটি সুরক্ষিত প্রক্রিয়া হতে হবে, যেখানে filtering techniques ব্যবহারের মাধ্যমে সুরক্ষা নিশ্চিত করা হয়। কিছু গুরুত্বপূর্ণ filtering techniques এর মধ্যে whitelist filtering, type checking, regular expression filtering, depth limiting, secure serialization libraries, এবং object injection protection অন্তর্ভুক্ত। এগুলি object injection, denial-of-service attacks, এবং code execution attacks প্রতিরোধে সাহায্য করে এবং data deserialization প্রক্রিয়া সুরক্ষিত রাখে।
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() ফাংশনের একটি অপরিহার্য অংশ।
Read more