PHP টিউটোরিয়াল: জানুন PHP Session সম্পর্কে এবং কেন নিরাপদ নয় লগিন পেজে শুধুমাত্র SESSION ব্যবহার করা ।
আমি অনেক ডেভোলপারকেই লগিন সিস্টেমে শুধুমাত্র Sessions এর ব্যবহার করতে দেখেছি, বড় এবং গুরুত্বপূর্ন অ্যাপ্লিকেশনে এটা করা কখনোই উচিত নয় । আসুন প্রথমে পরিচিত হয়ে নেয়া যাক পিএইচপি session এর সাথে ।
PHP SESSION:
কম্পিউটারে যখন কোনো সফটওয়্যার ওপেন করেন এবং সফটওয়্যারটি ক্লোজ করার আগ পর্যন্ত যাবতীয় কাজ নিয়ে একটা session এর মতন তৈরী হয়, এক্ষেত্রে কম্পিউটার জানে কখন সফটওয়্যার ওপেন করেছেন, কখন বন্ধ করেছেন ইত্যাদি । কিন্তু পিএইচপি সরাসরি সার্ভার র্যামে এরকম তথ্য সংরক্ষন করবে না ফলে আবির্ভাব হয় PHP Session এর । এরফলে কিছু তথ্য কে সংরক্ষন করে তা পরিবর্তীতে ব্যবহার করার সুযোগ তৈরী হয় । এখানে তথ্যগুলোকে একটি ফাইলে সংরক্ষন করা হয় পরবর্তীতে দরকার শেষে ফাইলটি ডিলেট করে ফেলা হয় ।
PHP SESSION যেভাবে কাজ করে:
যখন কোনো পিএইচপি session কে রেজিস্টার করা হয় তখন তথ্যটি সংরক্ষন করার জন্য সার্ভারে একটি ফাইল তৈরী হয় এবং সেই সাথে তৈরী হয় একটি ইউনিক session আইডি যা browser cookies এ সংরক্ষন করা হয় । সাধারনত ফাইলটি সার্ভারের টেম্পোরারী কোনো ডিরেক্টরিতে তৈরী করা হয় যাতে অটো ম্যাটেক্যালী এটি কিছু সময় পর সার্ভার মুছে ফেলে । সার্ভার ঐ session আইডি ব্যবহার করে ফাইলে সংরক্ষিত তথ্য কে প্রদশন করে ।
PHP SESSION কি কি কাজে লাগে?
ধরুন আপনার কোনো ডেটাকে আপনি পিএইচপিতে এক পেজ থেকে অন্য পেজে স্থানান্তর করতে চান । সেক্ষেত্রে এর দরকার হয় । মূলত তথ্যকে সংরক্ষন করার জন্য এটি ব্যবহার করা হয় । ডেটাবেজ ব্যবহার না করেও এটি একটি তথ্য সংরক্ষন করার পদ্ধতি । পিএইচপি যখন তথ্য সংরক্ষন করে তা সংরক্ষনের জন্য ডেটাবেজ লাগে, কিন্তু ছোট ছোট ডেটা কিংবা অল্প সময়ের জন্য সংরক্ষর করতে হয় এমন ডেটা ডেটাবেজ বানিয়ে সংরক্ষন করা বিরক্তিকর এবং ঝামেলাজনক এক্ষেত্রে session ব্যবহার করা যায় ।
ব্যবহার করার পদ্ধতি:
প্রথমেই আপনাকে session start দিয়ে সার্ভারকে বুঝাতে হবে যে একটি session ফাইল তৈরী করতে হবে । সার্ভার নতুন এবং ইউনিক একটা আইডি দিয়ে একটি ফাইল তৈরী করবে । আমাদের কাজ হবে এরপর ডেটাকে সংরক্ষন করা:
session_start();
$_SESSION["username"] = "greenweb"; ?>
এখানে username হলো কিই, আর greenweb হলো তথ্য যা আমরা সংরক্ষন করতে চাই । পরবর্তিতে যখন ইউজার নেম জানতে চাওয়া হবে এটি greenweb দেখাবে ।
ডেটা কিভাবে দেখাবেন?
এখন ঐসার্ভারে আমরা যেপেজে সংরক্ষিত ডেটাকে দেখাতে চাই সে পেজে আবার session start করতে হবে ।
session_start(); echo $_SESSION["username"];
?>
যখন উপরের কোড এক্সিকিউট করা হবে greenweb দেখাবে ।
Session সমাপ্ত করার পদ্ধতি :
যদি কোনো single session কে বন্ধ করতে চান unset() function ব্যবহার করে করতে পারবেন নিচের মত করে
session_start(); unset($_SESSION["username"]);
?>
যদি সব বন্ধ করতে চান তবে:
session_start();
session_unset();
?>
এরফলে শুধু ডাটা মুছে যাবে কিন্তু ফাইল থেকে যাবে । যদি ফাইলকেও মুছতে চান তবে :
session_start();
// terminate the session
session_destroy();
?>
কেন নিরাপদ নয় শুধুমাত্র SESSION ব্যবহার করে লগিন সিস্টেম বানানো ?
যদিও php session যথেস্ট নিরাপদ একটি ব্যবস্থা কিন্তু সার্ভার এর নিরাপত্ত্বা কিংবা স্লো প্র্রসেসিং এর জন্য বড় অ্যাপ্লিকেশনের লগিন সিস্টেমে শুধুমাত্র session ব্যবহার করা নিরাপদ নয় ।
- সার্ভার এর যে ডিরেক্টরিতে ডেটা সংরক্ষন আছে তা সেই ডিরেক্টরি নিরাপদ না থাকতে পারে ।
- যখন কোনো session ওপেন করা হয় এবং session ক্লোজও সাথে সাথে করা হয়, যদি ওপেন করার রিকোয়েস্ট ক্লোজের পরও পেন্ডিং থাকে তবে এক্ষেত্রে একটি তৃতীয় session তৈরী হতে পারে । এটি একটি bugs এবং অনেক বেশী তথ্য আদান প্রদান হয় এমন সিস্টেমে এটি দেখা যায় । এক্ষেত্রে যে সমস্যা টি হবে তা হলো দেখা যাবে এক ইউজার এর অ্যাকাউন্টে অন্য ইউজার অটোম্যাটিক্যালী লগিন হয়ে গিয়েছে ।
- session hijacking এর সম্ভাবনা থাকে এক্ষেত্রে ।
- session ঠিক মতো বন্ধ না করার ফলে অটো লগিন হয়ে যেতে পারে ।
১-৩ নং সমস্যার সমাধানের জন্য session এর সাথে ডেটাবেজ টেবিল বানিয়ে তথ্য সংরক্ষন করতে হবে । যেমন: যখনই কেউ লগিন করবে ডেটাবেজে একটি র্যানডম ডেটা এন্ট্রি হবে এবং ঐ ডেটাই session এর সংরক্ষন করতে হবে সেই সাথে যে ইউজার ঐ ডেটা জেনারেট করেছে তার আইডি ডেটাবেজে রাখতে হবে এবং চেক করতে হবে ঐ ইউজারই session টি ব্যবহার করছে । 2 নং সমস্যাটি ছোট অ্যাপ্লিকেশনে হবার সম্ভাবনা প্রায় নেই বলা যায় কিন্তু বড় অ্যাপ্লিকেশন যাতে অনেক ইউজার প্রতিনিয়ত কাজ করে তাতে হতে পারে ।
3-4 নং সমস্যার সমাধানের জন্য টাইম আউট সিস্টেম তৈরি করতে হবে । নির্দিষ্ট সময় পর্যন্ত ইউজার ইনএকটিভ থাকলে অটোম্যাটিক্যালি তার জেনারেটকৃত ডেটা মুছে যাবে । নিচের মত কোড ব্যবহার করে এটি করা যায়:
session_start();
$inactive = 600;
if (isset($_SESSION["timeout"])) {
$sessionTTL = time() - $_SESSION["timeout"];
if ($sessionTTL > $inactive) {
session_destroy();
header("Location: /logout.php");
}
}
$_SESSION["timeout"] = time();?>
এছাড়াও, session data যে ফেল্ডারে সংরক্ষন হয় তা নিরাপদ করতে হবে ।
SESSION এবং Database এর সমন্বয় করে নিরাপদ লগিন সিস্টেম তৈরি করা যাবে । যেখানে নিরাপত্ত্বা গুরুত্বপূর্ন সেখানে সুযোগ না রাখাই উচিত ।
লিখেছেন -
মো: জোবায়ের আলম
ফাউন্ডার, গ্রিনওয়েব বাংলাদেশ ।

Mostafiz (2018-02-13 13:12:45)
ধন্যবাদ
Anisur Rahman (2018-04-28 13:39:43)
ধন্যবাদ, আশা করি PHP সম্পর্কে এই ধরনের গুরুত্বপূর্ন আরো তথ্য আপনার কাছ থেকে পাব।
Leave A Feedback