পিএইচপি-তে সেশন আইডি সুরক্ষা। পিএইচপিতে সেশন ব্যবহার করার ক্ষতি একটি PHP সেশন ব্যবহার করে একটি মান বা অ্যারে পাস করা

শুভেচ্ছা, প্রিয় সম্প্রদায়।

প্রথমত, আমি একটি খুব দরকারী সম্পদের জন্য আপনাকে ধন্যবাদ জানাতে চাই। একাধিকবার আমি এখানে অনেক আকর্ষণীয় ধারণা এবং ব্যবহারিক পরামর্শ পেয়েছি।

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

সেশন ব্যবহার করার সবচেয়ে সাধারণ উদাহরণ, অবশ্যই, ব্যবহারকারীর অনুমোদন। চলুন শুরু করা যাক সবচেয়ে মৌলিক বাস্তবায়নের সাথে যাতে ধীরে ধীরে এটিকে বিকাশ করা যায় যখন নতুন কাজ আসে।

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

ফাংশন startSession() ( // যদি সেশনটি ইতিমধ্যেই শুরু হয়ে থাকে, তাহলে এক্সিকিউট করা বন্ধ করুন এবং TRUE ফেরত দিন // (php.ini সেটিংস ফাইলের session.auto_start প্যারামিটারটি নিষ্ক্রিয় করা আবশ্যক - ডিফল্ট মান) যদি (session_id()) ফিরে আসে true; else return session_start(); // দ্রষ্টব্য: সংস্করণ 5.3.0 এর পূর্বে, session_start() ফাংশনটি সত্য রিটার্ন করে, এমনকি একটি ত্রুটি দেখা দিলেও। session_id() // কল করার পর session_start() ) ফাংশন deleteSession() ( if (session_id()) ( // যদি একটি সক্রিয় সেশন থাকে, তাহলে সেশন কুকিজ, setcookie(session_name(), session_id(), time( )-60*60*24); // এবং সেশনটি ধ্বংস করুন সেশন_আনসেট(); সেশন_ডিস্ট্রয়(); ))

দ্রষ্টব্য: এটা ধরে নেওয়া হয় যে পাঠকের পিএইচপি সেশন সম্পর্কে প্রাথমিক জ্ঞান রয়েছে, তাই আমরা এখানে session_start() এবং session_destroy() ফাংশনগুলির অপারেশনের নীতিটি কভার করব না। লগইন ফর্মের লেআউট এবং ব্যবহারকারীর প্রমাণীকরণের কাজগুলি নিবন্ধের বিষয়ের সাথে সম্পর্কিত নয়, তাই আমরা সেগুলিও বাদ দেব। আমি আপনাকে শুধু মনে করিয়ে দিচ্ছি যে প্রতিটি পরবর্তী অনুরোধে ব্যবহারকারীকে শনাক্ত করতে, সফল লগইনের মুহুর্তে, আমাদের একটি সেশন ভেরিয়েবলে (উদাহরণস্বরূপ userid নামে) ব্যবহারকারী শনাক্তকারী সংরক্ষণ করতে হবে, যা পরবর্তী সমস্ত অনুরোধের মধ্যে উপলব্ধ হবে অধিবেশনের জীবন। আমাদের startSession() ফাংশনের ফলাফল প্রক্রিয়াকরণ বাস্তবায়ন করাও প্রয়োজন। যদি ফাংশনটি FALSE প্রদান করে, ব্রাউজারে লগইন ফর্মটি প্রদর্শন করুন৷ যদি ফাংশনটি সত্য ফেরত দেয়, এবং অনুমোদিত ব্যবহারকারীর শনাক্তকারী সহ একটি সেশন ভেরিয়েবল (আমাদের ক্ষেত্রে - userid), বিদ্যমান থাকে - অনুমোদিত ব্যবহারকারীর পৃষ্ঠাটি প্রদর্শন করুন (ত্রুটি পরিচালনা সম্পর্কে আরও তথ্যের জন্য, 2013-06 তারিখের সংযোজন দেখুন- সেশন ভেরিয়েবলের বিভাগে 07)।

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

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

ফাংশন startSession() ( // ব্যবহারকারীর নিষ্ক্রিয়তার সময়সীমা (সেকেন্ডে) $sessionLifetime = 300; যদি (session_id()) সত্য হয়; // কুকি লাইফটাইম ini_set("session.cookie_lifetime", $sessionLifetime) সেট করুন; // যদি ব্যবহারকারী নিষ্ক্রিয়তার সময়সীমা সেট করা হয়েছে, সার্ভারে সেশনের জীবনকাল সেট করুন // দ্রষ্টব্য: একটি প্রোডাকশন সার্ভারের জন্য, php.ini ফাইলে এই প্যারামিটারগুলি প্রিসেট করার পরামর্শ দেওয়া হয় যদি ($sessionLifetime) ini_set("session.gc_maxlifetime", $sessionLifetime) ; যদি (session_start( )) ( setcookie(session_name(), session_id(), time()+$sessionLifetime); সত্য ফেরত; ) অন্যথা মিথ্যা ফেরত; )

কয়েকটি স্পষ্টীকরণ। আপনি জানেন, অনুরোধ শিরোনামে ব্রাউজার দ্বারা প্রেরিত কুকি নামের দ্বারা পিএইচপি কোন সেশন চালু করতে হবে তা নির্ধারণ করে। ব্রাউজার, ঘুরে, সার্ভার থেকে এই কুকি গ্রহণ করে, যেখানে session_start() ফাংশন এটি রাখে। ব্রাউজার কুকির মেয়াদ শেষ হয়ে গেলে, এটি অনুরোধে পাঠানো হবে না, যার মানে PHP কোন সেশন শুরু করবে তা নির্ধারণ করতে সক্ষম হবে না এবং এটিকে একটি নতুন সেশন তৈরি হিসাবে বিবেচনা করবে। PHP সেটিংস প্যারামিটার session.gc_maxlifetime, যা আমাদের ব্যবহারকারীর নিষ্ক্রিয়তার সময়সীমার সমান সেট করা হয়, একটি PHP সেশনের জীবনকাল সেট করে এবং সার্ভার দ্বারা নিয়ন্ত্রিত হয়। সেশনের জীবনকাল নিয়ন্ত্রণ করা নিম্নরূপ কাজ করে (এখানে আমরা PHP-তে সবচেয়ে সাধারণ এবং ডিফল্ট বিকল্প হিসাবে অস্থায়ী ফাইলগুলিতে সেশন সংরক্ষণের একটি উদাহরণ বিবেচনা করি)।

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

দ্রষ্টব্য: এখানে উল্লেখ করা উচিত যে session.gc_maxlifetime প্যারামিটার একটি সার্ভারের মধ্যে সমস্ত সেশনে প্রযোজ্য (আরো স্পষ্টভাবে, একটি প্রধান PHP প্রক্রিয়ার মধ্যে)। অনুশীলনে, এর অর্থ হল যে যদি বেশ কয়েকটি সাইট সার্ভারে চলছে, এবং তাদের প্রত্যেকের নিজস্ব ব্যবহারকারী নিষ্ক্রিয়তার সময়সীমা থাকে, তবে সাইটের একটিতে এই প্যারামিটারটি সেট করা অন্য সাইটগুলির জন্য এটির সেটিংকে নেতৃত্ব দেবে। শেয়ার্ড হোস্টিং এর ক্ষেত্রেও একই কথা প্রযোজ্য। এই পরিস্থিতি এড়াতে, একই সার্ভারের মধ্যে প্রতিটি সাইটের জন্য পৃথক সেশন ডিরেক্টরি ব্যবহার করা হয়। php.ini সেটিংস ফাইলে session.save_path প্যারামিটার ব্যবহার করে অথবা ini_set() ফাংশন কল করে সেশন ডিরেক্টরিতে পাথ সেট করা হয়। এর পরে, প্রতিটি সাইটের সেশনগুলি আলাদা ডিরেক্টরিতে সংরক্ষণ করা হবে, এবং সাইটের একটিতে সেট করা session.gc_maxlifetime প্যারামিটার শুধুমাত্র তার সেশনের জন্য বৈধ হবে। আমরা এই কেসটি বিশদভাবে বিবেচনা করব না, বিশেষত যেহেতু আমাদের কাছে ব্যবহারকারীর নিষ্ক্রিয়তা নিরীক্ষণের জন্য আরও নমনীয় বিকল্প রয়েছে।

সেশন ভেরিয়েবল ব্যবহার করে ব্যবহারকারীর নিষ্ক্রিয়তা নিয়ন্ত্রণ করা এটা মনে হবে যে আগের বিকল্পটি, তার সমস্ত সরলতার জন্য (কোডের মাত্র কয়েকটি অতিরিক্ত লাইন), আমাদের প্রয়োজনীয় সবকিছু দেয়। কিন্তু যদি প্রতিটি অনুরোধ ব্যবহারকারীর কার্যকলাপের ফলাফল হিসাবে গণ্য করা যায় না? উদাহরণস্বরূপ, একটি পৃষ্ঠায় একটি টাইমার রয়েছে যা সার্ভার থেকে আপডেট পাওয়ার জন্য পর্যায়ক্রমে একটি AJAX অনুরোধ করে। এই ধরনের অনুরোধ ব্যবহারকারীর কার্যকলাপ হিসাবে গণ্য করা যাবে না, যার মানে স্বয়ংক্রিয়ভাবে সেশনের জীবনকাল বাড়ানো এই ক্ষেত্রে সঠিক নয়। কিন্তু আমরা জানি যে PHP সেশন ফাইলের পরিবর্তনের সময় স্বয়ংক্রিয়ভাবে আপডেট করে যখনই session_start() ফাংশন কল করা হয়, যার মানে হল যে কোনও অনুরোধ সেশনের জীবনকালের একটি এক্সটেনশনের দিকে নিয়ে যাবে, এবং ব্যবহারকারীর নিষ্ক্রিয়তার সময়সীমা কখনই ঘটবে না। উপরন্তু, session.gc_maxlifetime প্যারামিটারের জটিলতা সম্পর্কে পূর্ববর্তী বিভাগের শেষ নোটটি অনেক বিভ্রান্তিকর এবং কিছুর জন্য বাস্তবায়ন করা কঠিন বলে মনে হতে পারে।

এই সমস্যাটি সমাধান করার জন্য, আমরা অন্তর্নির্মিত PHP পদ্ধতির ব্যবহার ত্যাগ করব এবং বেশ কয়েকটি নতুন সেশন ভেরিয়েবল প্রবর্তন করব যা আমাদের ব্যবহারকারীর নিষ্ক্রিয়তার সময় নিজেরাই নিয়ন্ত্রণ করতে দেবে।

ফাংশন startSession($isUserActivity=true) ( ​​$sessionLifetime = 300; যদি (session_id()) সত্য ফিরে আসে; // ব্রাউজার বন্ধ করার আগে কুকি লাইফটাইম সেট করুন (আমরা সার্ভার সাইডে সবকিছু নিয়ন্ত্রণ করব) ini_set("session. cookie_lifetime", 0) ; if (! session_start()) মিথ্যা ফেরত দেয়; $t = time(); if ($sessionLifetime) ( // ব্যবহারকারীর নিষ্ক্রিয়তার সময়সীমা সেট করা থাকলে, // ব্যবহারকারীর শেষ কার্যকলাপের পর থেকে অতিবাহিত সময় পরীক্ষা করুন // (শেষ অনুরোধের সময় যখন লাস্ট অ্যাক্টিভিটি সেশন ভেরিয়েবল আপডেট করা হয়েছিল) যদি (isset($_SESSION["lastactivity"]) && $t-$_SESSION["lastactivity"] >= $sessionLifetime) ( // যদি সময় অতিবাহিত হয় ব্যবহারকারীর শেষ কার্যকলাপ, // নিষ্ক্রিয়তার টাইমআউটের চেয়ে বড়, যার মানে সেশনটির মেয়াদ শেষ হয়ে গেছে এবং আপনাকে সেশনটি শেষ করতে হবে DestroySession(); return false; ) অন্যথায় ( // যদি টাইমআউট এখনও না হয়ে থাকে, // এবং যদি ব্যবহারকারীর কার্যকলাপের ফলস্বরূপ অনুরোধটি আসে, // বর্তমান এক সময়ের মান সহ লাস্টঅ্যাক্টিভিটি ভেরিয়েবল আপডেট করুন, // যার ফলে সেশনের সময় অন্য সেশন লাইফটাইম সেকেন্ড দ্বারা প্রসারিত করুন যদি ($isUserActivity) $_SESSION["lastactivity"] = $t; ) ) সত্য ফিরে; )

আসুন সংক্ষিপ্ত করা যাক। প্রতিটি অনুরোধে, আমরা শেষ ব্যবহারকারীর কার্যকলাপ থেকে বর্তমান মুহূর্ত পর্যন্ত টাইমআউট পৌঁছেছে কিনা তা পরীক্ষা করি এবং যদি এটি পৌঁছে যায়, আমরা সেশনটি ধ্বংস করি এবং ফাংশন সম্পাদনে বাধা প্রদান করে, FALSE ফেরত দিই। যদি টাইমআউট না পৌঁছে যায়, এবং $isUserActivity প্যারামিটারটি TRUE মান সহ ফাংশনে পাস করা হয়, আমরা ব্যবহারকারীর শেষ কার্যকলাপের সময় আপডেট করি। আমাদের যা করতে হবে তা হল কলিং স্ক্রিপ্টে নির্ধারণ করা যে অনুরোধটি ব্যবহারকারীর কার্যকলাপের ফলাফল কিনা এবং যদি না হয়, তাহলে $isUserActivity প্যারামিটারটি FALSE এ সেট করে startSession ফাংশনটি কল করুন।

2013-06-07 থেকে সংযোজন সেশনস্টার্ট() ফাংশনের ফলাফল প্রক্রিয়াকরণ

মন্তব্যগুলি নির্দেশ করে যে FALSE ফেরত দেওয়া ত্রুটির কারণ সম্পর্কে সম্পূর্ণ ধারণা প্রদান করে না এবং এটি সম্পূর্ণ ন্যায্য। আমি এখানে বিস্তারিত ত্রুটি হ্যান্ডলিং প্রকাশ করিনি (নিবন্ধের দৈর্ঘ্য ইতিমধ্যেই বেশ বড়), যেহেতু এটি সরাসরি নিবন্ধের বিষয়ের সাথে সম্পর্কিত নয়। তবে মন্তব্য দেওয়া, আমি স্পষ্ট করব।

আপনি দেখতে পাচ্ছেন, সেশনস্টার্ট ফাংশন দুটি ক্ষেত্রে FALSE ফেরত দিতে পারে। হয় কিছু অভ্যন্তরীণ সার্ভার ত্রুটির কারণে সেশন শুরু করা যায়নি (উদাহরণস্বরূপ, php.ini-এ ভুল সেশন সেটিংস), অথবা সেশনের জীবনকাল শেষ হয়ে গেছে। প্রথম ক্ষেত্রে, আমাদের অবশ্যই ব্যবহারকারীকে একটি ত্রুটি সহ একটি পৃষ্ঠায় পুনঃনির্দেশ করতে হবে যে সার্ভারে সমস্যা রয়েছে এবং সহায়তার সাথে যোগাযোগ করার জন্য একটি ফর্ম রয়েছে৷ দ্বিতীয় ক্ষেত্রে, আমাদের অবশ্যই ব্যবহারকারীকে লগইন ফর্মে স্থানান্তর করতে হবে এবং সেশনের মেয়াদ শেষ হয়ে গেছে বলে এটিতে একটি সংশ্লিষ্ট বার্তা প্রদর্শন করতে হবে। এটি করার জন্য, আমাদের ত্রুটি কোড লিখতে হবে এবং FALSE এর পরিবর্তে সংশ্লিষ্ট কোডটি ফেরত দিতে হবে এবং কলিং পদ্ধতিতে, এটি পরীক্ষা করে সেই অনুযায়ী কাজ করতে হবে।

এখন, এমনকি যদি সার্ভারে একটি সেশন এখনও বিদ্যমান থাকে, ব্যবহারকারীর নিষ্ক্রিয়তার সময়সীমা শেষ হয়ে গেলে এটি প্রথমবার অ্যাক্সেস করার সময় এটি ধ্বংস হয়ে যাবে। এবং গ্লোবাল পিএইচপি সেটিংসে কোন সেশনের জীবনকাল সেট করা হোক না কেন এটি ঘটবে।

দ্রষ্টব্য: ব্রাউজারটি বন্ধ হয়ে গেলে এবং সেশনের নাম কুকি স্বয়ংক্রিয়ভাবে ধ্বংস হয়ে গেলে কী হবে? পরের বার ব্রাউজার খোলার সময় সার্ভারের কাছে অনুরোধ সেশন কুকি ধারণ করবে না এবং সার্ভারটি সেশন খুলতে এবং ব্যবহারকারীর নিষ্ক্রিয়তার সময়সীমা পরীক্ষা করতে সক্ষম হবে না। আমাদের জন্য, এটি একটি নতুন সেশন তৈরি করার সমতুল্য এবং কার্যকারিতা বা নিরাপত্তাকে কোনোভাবেই প্রভাবিত করে না। কিন্তু একটি ন্যায্য প্রশ্ন উঠেছে - তাহলে পুরানো অধিবেশন কে ধ্বংস করবে, যদি এখন পর্যন্ত আমরা সময়সীমা শেষ হওয়ার পরে এটি ধ্বংস করে থাকি? অথবা এটি কি এখন সেশন ডিরেক্টরিতে চিরতরে ঝুলবে? পিএইচপি-তে পুরানো সেশনগুলি পরিষ্কার করার জন্য, আবর্জনা সংগ্রহ নামে একটি প্রক্রিয়া রয়েছে। এটি সার্ভারের পরবর্তী অনুরোধের সময় চলে এবং সেশন ফাইলের শেষ পরিবর্তনের তারিখের উপর ভিত্তি করে সমস্ত পুরানো সেশন সাফ করে। কিন্তু আবর্জনা সংগ্রহের প্রক্রিয়া সার্ভারের কাছে প্রতিটি অনুরোধের সাথে শুরু হয় না। লঞ্চের ফ্রিকোয়েন্সি (বা বরং, সম্ভাবনা) দুটি সেটিংস পরামিতি session.gc_probability এবং session.gc_divisor দ্বারা নির্ধারিত হয়। প্রথম প্যারামিটারটিকে দ্বিতীয় দ্বারা ভাগ করার ফলাফল হল আবর্জনা সংগ্রহের প্রক্রিয়া চালু করার সম্ভাবনা। এইভাবে, সার্ভারে প্রতিটি অনুরোধের সাথে সেশন ক্লিয়ারিং মেকানিজম চালু করার জন্য, এই পরামিতিগুলিকে অবশ্যই সমান মান সেট করতে হবে, উদাহরণস্বরূপ "1"৷ এই পদ্ধতিটি একটি পরিষ্কার সেশন ডিরেক্টরির গ্যারান্টি দেয়, তবে সার্ভারের জন্য স্পষ্টতই খুব ব্যয়বহুল। অতএব, উৎপাদন ব্যবস্থায়, session.gc_divisor-এর ডিফল্ট মান 1000-এ সেট করা হয়েছে, যার অর্থ হল আবর্জনা সংগ্রহের প্রক্রিয়াটি 1/1000 এর সম্ভাব্যতার সাথে চলবে। আপনি যদি আপনার php.ini ফাইলে এই সেটিংসগুলি নিয়ে পরীক্ষা করেন, আপনি লক্ষ্য করতে পারেন যে উপরে বর্ণিত ক্ষেত্রে, যখন ব্রাউজারটি তার সমস্ত কুকিজ বন্ধ করে এবং সাফ করে, তখনও কিছু সময়ের জন্য সেশন ডিরেক্টরিতে পুরানো সেশনগুলি অবশিষ্ট থাকে৷ তবে এটি আপনার চিন্তা করা উচিত নয়, কারণ ... আগেই বলা হয়েছে, এটি কোনোভাবেই আমাদের মেকানিজমের নিরাপত্তাকে প্রভাবিত করে না।

2013-06-07 থেকে আপডেট সেশন ফাইল লক করার কারণে স্ক্রিপ্টগুলিকে জমাট থেকে আটকানো

মন্তব্যগুলি সেশন ফাইল অবরুদ্ধ হওয়ার কারণে স্ক্রিপ্টগুলি একযোগে চালানোর সমস্যাটি উত্থাপন করেছে (সবচেয়ে আকর্ষণীয় বিকল্প হল দীর্ঘ ভোট)।

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

সেশন ফাইলকে ন্যূনতমভাবে লক করার জন্য, সেশন ভেরিয়েবল সহ সমস্ত ক্রিয়া সম্পন্ন হওয়ার সাথে সাথে session_write_close() ফাংশনটি কল করে সেশনটি বন্ধ করার জন্য দৃঢ়ভাবে সুপারিশ করা হয়। অনুশীলনে, এর মানে হল যে আপনি সেশন ভেরিয়েবলে সবকিছু সঞ্চয় করবেন না এবং স্ক্রিপ্টটি কার্যকর করার সময় সেগুলি অ্যাক্সেস করবেন না। এবং যদি আপনার সেশন ভেরিয়েবলে কিছু কার্যকারী ডেটা সঞ্চয় করার প্রয়োজন হয়, তাহলে সেশন শুরু হওয়ার সাথে সাথে সেগুলি পড়ুন, পরবর্তীতে ব্যবহারের জন্য সেগুলি স্থানীয় ভেরিয়েবলে সংরক্ষণ করুন এবং সেশনটি বন্ধ করুন (অর্থাৎ session_write_close ফাংশন ব্যবহার করে সেশন বন্ধ করুন, এবং session_destroy ব্যবহার করে এটি ধ্বংস করবেন না। )

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

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

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

কিভাবে আপনি এই ধরনের আক্রমণ থেকে নিজেকে রক্ষা করতে পারেন? আবার, স্পষ্টতই, সেশন শনাক্তকারীর জীবনকাল সীমাবদ্ধ করে এবং পর্যায়ক্রমে একই সেশনের মধ্যে সনাক্তকারী পরিবর্তন করে। আমরা পুরানোটি সম্পূর্ণরূপে মুছে ফেলে এবং একটি নতুন সেশন তৈরি করে সেশনের নাম পরিবর্তন করতে পারি, পুরানোটি থেকে সমস্ত সেশন ভেরিয়েবল এতে অনুলিপি করে। কিন্তু এটি পদ্ধতির সারমর্মকে প্রভাবিত করে না, তাই সরলতার জন্য আমরা নিজেদেরকে শুধুমাত্র সেশন শনাক্তকারীর মধ্যে সীমাবদ্ধ রাখব।

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

(আমরা কোডের অংশটি বাদ দেব যা ইতিমধ্যে আলোচনা করা হয়েছে)।

ফাংশন startSession($isUserActivity=true) ( ​​// সেশন আইডেন্টিফায়ার লাইফটাইম $idLifetime = 60; ... if ($idLifetime) ( // যদি সেশন আইডেন্টিফায়ার লাইফটাইম সেট করা থাকে, // সেশনটি হওয়ার পর থেকে অতিবাহিত সময় চেক করুন তৈরি বা শেষ পুনর্জন্ম // (শেষ অনুরোধের সময় যখন সেশন ভেরিয়েবল স্টার্টটাইম আপডেট করা হয়েছিল) if (isset($_SESSION["starttime"])) ( if ($t-$_SESSION["starttime"] >= $ idLifetime) ( // সেশন শনাক্তকারীর জীবন মেয়াদ শেষ হওয়ার সময় // একটি নতুন শনাক্তকারী তৈরি করুন session_regenerate_id(true); $_SESSION["starttime"] = $t; ) ) অন্যথায় ( // সেশনটি ঠিক থাকলে আমরা এখানে পাই তৈরি করা হয়েছে // বর্তমান সময়ে সেশন শনাক্তকারী তৈরি করার জন্য সময় সেট করুন $_SESSION["starttime"] = $t; ) ) সত্য ফেরত দিন

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

দ্রষ্টব্য: নতুন সেশন আইডি ব্রাউজারের কুকিতে প্রবেশ করে যখন session_regenerate_id() ফাংশন কল করা হয়, যা নতুন কুকি পাঠায়, যেমন session_start() ফাংশন, তাই আমাদের নিজেদেরকে কুকি আপডেট করতে হবে না।

আমরা যদি আমাদের সেশনগুলিকে যতটা সম্ভব সুরক্ষিত করতে চাই, শনাক্তকারীর জীবনকাল একটিতে সেট করা বা এমনকি বন্ধনী থেকে session_regenerate_id() ফাংশনটি সরিয়ে দেওয়া এবং সমস্ত চেকগুলি সরিয়ে ফেলা যথেষ্ট, যা প্রতিটিতে শনাক্তকারীর পুনর্জন্মের দিকে পরিচালিত করবে অনুরোধ (আমি পারফরম্যান্সের উপর এই পদ্ধতির প্রভাব পরীক্ষা করিনি, এবং আমি কেবল বলতে পারি যে session_regenerate_id(true) ফাংশনটি মূলত শুধুমাত্র 4টি ক্রিয়া সম্পাদন করে: একটি নতুন শনাক্তকারী তৈরি করা, সেশন কুকি দিয়ে একটি শিরোনাম তৈরি করা, পুরানোটি মুছে ফেলা এবং তৈরি করা একটি নতুন সেশন ফাইল)।

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

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

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

ফাংশন startSession($isUserActivity=true, $prefix=null) ( ... যদি (session_id()) সত্য ফেরত দেয়; // যদি ব্যবহারকারীর উপসর্গটি প্যারামিটারে পাস করা হয়, // একটি অনন্য সেশন নাম সেট করুন যাতে এটি অন্তর্ভুক্ত থাকে উপসর্গ, // অন্যথায় সমস্ত ব্যবহারকারীর জন্য সাধারণ নাম সেট করুন (উদাহরণস্বরূপ, MYPROJECT) session_name("MYPROJECT।"($prefix ? "_."$prefix: "")); ini_set("session.cookie_lifetime", 0); যদি (! session_start()) মিথ্যা ফেরত দেয়; ... )

এখন যা বাকি আছে তা হল নিশ্চিত করা যে কলিং স্ক্রিপ্ট প্রতিটি ব্যবহারকারীর জন্য startSession() ফাংশনে একটি অনন্য উপসর্গ পাস করে। এটি করা যেতে পারে, উদাহরণস্বরূপ, প্রতিটি অনুরোধের GET/POST প্যারামিটারে একটি উপসর্গ পাস করে বা একটি অতিরিক্ত কুকির মাধ্যমে।

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

ফাংশন startSession($isUserActivity=true, $prefix=null) ( $sessionLifetime = 300; $idLifetime = 60; যদি (session_id()) true ফেরত দেয়; session_name("MYPROJECT"($prefix ? "_."$prefix: "")); ini_set("session.cookie_lifetime", 0); যদি (! session_start()) মিথ্যা ফেরত দেয়; $t = time(); if ($sessionLifetime) ( if (isset($_SESSION["lastactivity"] ) && $t-$_SESSION["lastactivity"] >= $sessionLifetime) ( deleteSession(); return false; ) else ( if ($isUserActivity) $_SESSION["lastactivity"] = $t; ) ) যদি ($idLifetime) ) ( if (isset($_SESSION["starttime"])) ( if ($t-$_SESSION["starttime"] >= $idLifetime) ( session_regenerate_id(true); $_SESSION["starttime"] = $t; আর -60*60*24; অধিবেশন_ধ্বংস (); ) )

আমি আশা করি যে এই নিবন্ধটি তাদের জন্য কিছু সময় বাঁচাবে যারা সেশন প্রক্রিয়ার মধ্যে গভীরভাবে অনুসন্ধান করেননি এবং যারা সবেমাত্র PHP-এর সাথে পরিচিত হতে শুরু করেছেন তাদের জন্য এই প্রক্রিয়াটি সম্পর্কে যথেষ্ট অন্তর্দৃষ্টি দেবে।

আপনি একটি ব্যবহারকারীর নাম এবং পাসওয়ার্ড প্রয়োজন?

অনলাইনে নিবন্ধ জমা দিতে এবং জমা দেওয়া নিবন্ধগুলির স্থিতি পরীক্ষা করতে, আপনাকে অবশ্যই নিবন্ধন করতে হবে এবং আপনার অ্যাকাউন্টে লগ ইন করতে হবে।

জমা দেওয়ার জন্য একটি নিবন্ধ প্রস্তুত করার জন্য চেকলিস্ট

নিবন্ধ জমা দেওয়ার প্রক্রিয়ার অংশ হিসাবে, লেখকদের অবশ্যই পরীক্ষা করতে হবে যে তাদের নিবন্ধটি নিম্নলিখিত সমস্ত পয়েন্টগুলি পূরণ করে; নিবন্ধগুলি লেখকদের কাছে ফেরত দেওয়া হতে পারে যদি তারা এই প্রয়োজনীয়তাগুলি পূরণ না করে।

নিবন্ধটি প্রয়োজনীয়তা অনুসারে প্রস্তুত করা হয়েছে

কপিরাইট স্থানান্তর শর্তাবলী

ক্রিয়েটিভ কমন্স অ্যাট্রিবিউশন লাইসেন্সের শর্তাবলীর অধীনে লাইসেন্স দেওয়ার সময় লেখকরা কাজের কপিরাইট বজায় রাখেন এবং কাজের সাথে জার্নালের প্রথম প্রকাশনার অধিকার দেন, যা অন্যদের এই কাজটি কাজের লেখকের কাছে বাধ্যতামূলক অ্যাট্রিবিউশন এবং একটি লিঙ্ক সহ বিতরণ করতে দেয়। এই জার্নালে মূল প্রকাশনার জন্য।

গোপনীয়তা বিবৃতি

এই ম্যাগাজিনের ওয়েবসাইটে প্রবেশ করা নাম এবং ইমেল ঠিকানাগুলি শুধুমাত্র এই ম্যাগাজিনের দ্বারা মনোনীত উদ্দেশ্যে ব্যবহার করা হবে এবং অন্য কোন উদ্দেশ্যে ব্যবহার করা হবে না বা অন্য কোন ব্যক্তি বা সত্তাকে প্রদান করা হবে না।

সিস্টেমে নিবন্ধন করার আগে, ব্যবহারকারী ব্যক্তিগত ডেটা প্রক্রিয়াকরণ এবং সঞ্চয় করার নীতির সাথে সম্মত হন।

লেখক অর্থপ্রদান

স্পেস সহ 1500 অক্ষর: 300.00 (RUB)

পাণ্ডুলিপির 1 পৃষ্ঠার প্রকাশনা (1500 অক্ষর) - 300 রুবেল। গ্রাফিক উপকরণ / টেবিল আলাদাভাবে প্রদান করা হয় - 50 রুবেল / 1 টুকরা। রাশিয়ার মধ্যে শিপিং সহ লেখকের অনুলিপি লেখকের অনুরোধে প্রদান করা হয় - 400 রুবেল। বিদেশে শিপিং - 800 রুবেল। প্রকাশনার জন্য উপাদান গ্রহণের একটি শংসাপত্র পাঠানোর খরচ 150 রুবেল।

সহগামী তথ্যের অনুবাদ (সম্পূর্ণ নাম, লেখকের কাজের স্থান; শিরোনাম; বিমূর্ত; কীওয়ার্ড) প্রতিটি অক্ষরের জন্য শূন্যস্থান সহ 0.5 রুবেল।

মনোযোগ! লেখক (প্রার্থী এবং বিজ্ঞানের ডাক্তার) যাদের, elibrary.ru অনুসারে, 300 বা তার বেশি উদ্ধৃতি রয়েছে (স্ব-উদ্ধৃতির ভাগ 30% এর বেশি হওয়া উচিত নয়) বিনামূল্যে প্রকাশিত হয়। আপনি যদি বিনামূল্যে প্রকাশনার জন্য যোগ্য হন, উপাদান জমা দেওয়ার সময়, মন্তব্য ক্ষেত্রে, উদ্ধৃতির সংখ্যা সহ আপনার লাইব্রেরি প্রোফাইলের একটি লিঙ্ক নির্দেশ করুন। সংগ্রহের জন্য শিপিং খরচ আলাদাভাবে দেওয়া হয়।

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

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

ব্যবহারকারীর প্রমাণীকরণের পরে, ওয়েব সার্ভার তাকে একটি সেশন আইডি প্রদান করে। এই আইডিটি ব্রাউজারে সংরক্ষণ করা হয় এবং যখনই প্রমাণীকরণের প্রয়োজন হয় তখন এটি প্রতিস্থাপিত হয়। এটি আপনাকে বারবার লগইন/পাসওয়ার্ড এন্ট্রি প্রক্রিয়া এড়াতে অনুমতি দেয়। এই সমস্ত ব্যাকগ্রাউন্ডে ঘটে এবং ব্যবহারকারীর অস্বস্তি সৃষ্টি করে না। আপনি একটি নতুন পৃষ্ঠা দেখার সময় আপনার ব্যবহারকারীর নাম এবং পাসওয়ার্ড প্রবেশ করান যদি কল্পনা করুন!

এই নিবন্ধে আমি পিএইচপি-তে সেশন আইডি সুরক্ষিত করার জন্য আমার জানা সমস্ত উপায়ের রূপরেখা দেওয়ার চেষ্টা করব।

কুকিজ ব্যবহার করা ডিফল্টরূপে, আইডি সহ সমস্ত সেশনের তথ্য একটি কুকিতে পাঠানো হয়। কিন্তু এটা সবসময় ঘটবে না। কিছু ব্যবহারকারী তাদের ব্রাউজারে কুকিজ নিষ্ক্রিয় করে। এই ক্ষেত্রে, ব্রাউজার URL-এ সেশন আইডি পাস করবে।

এখানে আইডিটি স্পষ্ট পাঠ্যে প্রেরণ করা হয়, কুকির মাধ্যমে একটি সেশনের বিপরীতে, যখন তথ্যটি HTTP শিরোনামে লুকানো থাকে। এর বিরুদ্ধে রক্ষা করার সবচেয়ে সহজ উপায় হল ঠিকানা বারের মাধ্যমে সেশন শনাক্তকারীর সংক্রমণ নিষিদ্ধ করা। Apache সার্ভার .htaccess কনফিগারেশন ফাইলে নিম্নলিখিতগুলি লিখে এটি করা যেতে পারে:

Php_flag session.use_only_cookies চালু

এনক্রিপশন ব্যবহার করা যদি আপনার সাইটকে ক্রেডিট কার্ড নম্বরের মতো সংবেদনশীল তথ্য প্রক্রিয়া করতে হয় (সনি থেকে হ্যালো), তাহলে আপনাকে SSL3.0 বা TSL1.0 এনক্রিপশন ব্যবহার করতে হবে। এটি করার জন্য, একটি কুকি সেট করার সময়, আপনাকে অবশ্যই সুরক্ষিত প্যারামিটারের জন্য সত্য উল্লেখ করতে হবে।

আপনি যদি $_SESSION ভেরিয়েবলে সেশন পাসওয়ার্ড সংরক্ষণ করেন (এটি sql ব্যবহার করা এখনও ভাল), তাহলে আপনার এটি পরিষ্কার পাঠ্যে সংরক্ষণ করা উচিত নয়।

যদি ($_SESSION["পাসওয়ার্ড"] == $userpass) ( // কোড )

উপরের কোডটি নিরাপদ নয় কারণ পাসওয়ার্ডটি একটি সেশন ভেরিয়েবলে প্লেইন টেক্সট হিসেবে সংরক্ষণ করা হয়। পরিবর্তে, md5 এনক্রিপশন ব্যবহার করুন, এরকম কিছু:

যদি ($_SESSION["md5password"] == md5($userpass)) ( // কোড )

ব্রাউজার চেক অন্য ব্রাউজার (কম্পিউটার) থেকে একটি সেশন ব্যবহার করার সম্ভাবনা রোধ করতে, আপনাকে ব্যবহারকারী-এজেন্ট HTTP শিরোনাম ক্ষেত্রের একটি চেক লিখতে হবে:

অধিবেশন_শুরু(); যদি (isset($_SESSION["HTTP_USER_AGENT"])) ( if ($_SESSION["HTTP_USER_AGENT"] != md5($_SERVER["HTTP_USER_AGENT"])) ( // কোড ) ) অন্য ( $_SESSION["HTTP_USER_AGENT" ] = md5($_SERVER["HTTP_USER_AGENT"]);)

সেশনের মেয়াদ শেষ হওয়া সেশনের জীবনকাল, সেইসাথে কুকিজের মেয়াদ শেষ হওয়ার সময় সীমাবদ্ধ করুন। ডিফল্টরূপে, সেশনের সময়কাল 1440 সেকেন্ড। আপনি php.ini এবং .htaccess এর মাধ্যমে এই মান পরিবর্তন করতে পারেন। htaccess-এর উদাহরণ:

# সেকেন্ডে জীবনকাল
php_value session.gc_maxlifetime 3600
# সেকেন্ডে কুকির জীবনকাল
php_value session.cookie_lifetime 3600

IP ঠিকানা দ্বারা আবদ্ধ করা কিছু পরিস্থিতিতে (সর্বদা নয়), আপনার IP ঠিকানা দ্বারা আবদ্ধ করা উচিত। প্রধানত যখন ব্যবহারকারীর সংখ্যা সীমিত হয় এবং স্ট্যাটিক আইপি থাকে। চেকটি অনুমোদিত আইপি ঠিকানাগুলির তালিকার উপর ভিত্তি করে হতে পারে,

অন্তর্ভুক্ত ("ip_list.php"); //$ip_white_list = অ্যারে ("admin1" => "111.222.333.444", "admin2" => "555.666.777.888"); if(!empty(array_search($_SERVER["REMOTE_ADDR"],$ip_white_list))) ( শিরোনাম("অবস্থান: admin.php"); ) অন্য ( "ACCESS DENY!" প্রতিধ্বনি

অথবা প্রতিটি অনুরোধের জন্য আইপি ঠিকানা দ্বারা (শুধুমাত্র স্ট্যাটিক আইপির জন্য):

If(isset($_SESSION["ip"]) এবং $_SESSION["ip"] == $_SERVER["REMOTE_ADDR"]) ( হেডার("অবস্থান: admin.php"); ) অন্য ( session_unset(); $ _SESSION["ip"] = $_SERVER["REMOTE_ADDR"];)

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

এই নিবন্ধটি 2009 সালে লেখা হয়েছিল এবং এটি আমাদের সবচেয়ে জনপ্রিয় পোস্টগুলির মধ্যে একটি। আপনি যদি PHP এবং MySQL সম্পর্কে আরও জানতে আগ্রহী হন, তাহলে আপনি এটিকে খুব আগ্রহের বিষয় খুঁজে পেতে পারেন।

দ্রষ্টব্য: এই নিবন্ধটি PHP 4.2 বা পরবর্তীতে কাজ করার জন্য নতুনভাবে আপডেট করা হয়েছে!

সম্প্রতি, আমার একদল লোকের সাথে একটি ছোট প্রকল্পে কাজ করার উপলক্ষ ছিল। আমরা সেই ইমেলের প্রথম দিকে নির্ধারণ করেছিলাম যে সবাইকে লুপে রাখার জন্য একা যথেষ্ট হবে না, তাই আমাকে প্রকল্পের জন্য একটি ছোট ওয়েব সাইট তৈরি করার দায়িত্ব দেওয়া হয়েছিল। এটিতে একটি সাধারণ বার্তা বোর্ড থাকবে, এমন একটি জায়গা যেখানে আমরা দলের বাকি সদস্যদের ব্যবহারের জন্য নথি এবং অন্যান্য ফাইল আপলোড করতে পারি এবং বিভিন্ন দলের সদস্যদের জন্য যোগাযোগের তথ্য।

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

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

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

প্রথম অংশ: সাইন আপ প্রক্রিয়া সাইন আপ ফর্ম

এমন একটি সাইট তৈরি করা শুরু করার একটি প্রাকৃতিক জায়গা যেখানে ব্যবহারকারীদের অ্যাক্সেসের জন্য নিবন্ধন করতে হবে তা হল নিবন্ধন প্রক্রিয়া নিজেই। যেমনটি কেউ আশা করবে, একটি সাধারণ ওয়েব-ভিত্তিক ফর্মটি কৌশলটি করবে। এটি দেখতে কেমন হবে তা এখানে:

এবং এখানে এই ফর্মের কোড:




নতুন ব্যবহারকারীর জন্য নিবন্ধন



নতুন ব্যবহারকারী নিবন্ধন ফর্ম

* একটি আবশ্যক ক্ষেত্র নির্দেশ করে


উদ্দেশ্য এখন পরিষ্কার, আমি আপনাকে accesscontrol.php এর কোডের মাধ্যমে নিয়ে যাব। আপনার দুটি সহজ ফাইল অন্তর্ভুক্ত করে শুরু করুন: