পিএইচপি দিয়ে দায়বদ্ধ সেশন সুরক্ষা বজায় রাখার জন্য কিছু গাইডলাইন কি? সমস্ত ওয়েবে তথ্য রয়েছে এবং এটি প্রায় একই জায়গায় সমস্ত এক জায়গায় নেমেছে!
পিএইচপি দিয়ে দায়বদ্ধ সেশন সুরক্ষা বজায় রাখার জন্য কিছু গাইডলাইন কি? সমস্ত ওয়েবে তথ্য রয়েছে এবং এটি প্রায় একই জায়গায় সমস্ত এক জায়গায় নেমেছে!
উত্তর:
আপনার সেশনটি সুরক্ষিত রাখতে কয়েকটি জিনিস করতে হবে:
$_SERVER['HTTP_USER_AGENT']
। এটি সেশন হাইজ্যাকিংয়ে একটি ছোট বাধা যুক্ত করে। আপনি আইপি ঠিকানাও পরীক্ষা করতে পারেন। তবে এটি একাধিক ইন্টারনেট সংযোগ ইত্যাদিতে লোড ব্যালেন্সিং ইত্যাদির কারণে আইপি অ্যাড্রেস পরিবর্তনকারী ব্যবহারকারীদের জন্য সমস্যা সৃষ্টি করে (যা আমাদের পরিবেশের ক্ষেত্রে এটিই রয়েছে)।একটি নির্দেশিকা হ'ল প্রতিটি সময় সেশনের সুরক্ষা স্তরের পরিবর্তনের সময় সেশন_জেনারে_টি কল করা । এটি সেশন হাইজ্যাকিং প্রতিরোধে সহায়তা করে।
আমার দুটি (বা আরও) সেন্ট:
এই বিষয়টিতে একটি ছোট্ট তবে ভাল বই রয়েছে: ক্রিস শিফলেট দ্বারা আবশ্যক পিএইচপি সুরক্ষা ।
বইয়ের হোম পেজে আপনি কয়েকটি আকর্ষণীয় কোড উদাহরণ এবং নমুনা অধ্যায় পাবেন।
আপনি এখানে বর্ণিত (আইপি এবং ইউজার এজেন্ট) প্রযুক্তি ব্যবহার করতে পারেন: কীভাবে পরিচয় চুরি এড়ানো যায়
আমি মনে করি যে প্রধান সমস্যাগুলির মধ্যে একটি (যা পিএইচপি 6 তে সম্বোধন করা হচ্ছে) হ'ল নিবন্ধ__গ্লোবালগুলি। এই মুহূর্তে এড়াতে ব্যবহৃত স্ট্যান্ডার্ড পদ্ধতির একটি register_globals
হ'ল $_REQUEST
, $_GET
বা $_POST
অ্যারে ব্যবহার করা ।
এটি করার "সঠিক" উপায় (5.2 হিসাবে, যদিও এটি সেখানে সামান্য বগী, তবে 6 হিসাবে স্থিতিশীল, যা শীঘ্রই আসছে) ফিল্টারগুলির মাধ্যমে ।
এর পরিবর্তে:
$username = $_POST["username"];
আপনি কি করবেন:
$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
বা এমনকি:
$username = filter_input(INPUT_POST, 'username');
এই অধিবেশন স্থির কাগজটিতে খুব ভাল পয়েন্টার রয়েছে যেখানে আক্রমণ আসতে পারে। উইকিপিডিয়ায় সেশন স্থিরকরণ পৃষ্ঠাও দেখুন ।
আইপি ঠিকানা ব্যবহার করা আমার অভিজ্ঞতার পক্ষে সর্বোত্তম ধারণা নয়। উদাহরণ স্বরূপ; আমার অফিসে দুটি আইপি ঠিকানা রয়েছে যা লোডের উপর নির্ভর করে ব্যবহার করা হয় এবং আমরা আইপি অ্যাড্রেসগুলি ব্যবহার করে প্রতিনিয়ত সমস্যাগুলিতে চলে যাই।
পরিবর্তে, আমি আমার সার্ভারে ডোমেনগুলির জন্য একটি পৃথক ডাটাবেসে সেশনগুলি সংরক্ষণ করার সিদ্ধান্ত নিয়েছি। এই পদ্ধতিতে ফাইল সিস্টেমের কারওও সেই সেশনের তথ্যে অ্যাক্সেস নেই। এটি 3.0 এর আগে পিএইচপিবিবিতে সত্যই সহায়ক ছিল (তারা এটির পরে এটি ঠিক করেছে) তবে এটি এখনও আমার মনে হয় ভাল ধারণা।
এটি বেশ তুচ্ছ এবং সুস্পষ্ট, তবে প্রতিটি ব্যবহারের পরে সেশন_ডেস্ট্রয় করতে ভুলবেন না । যদি ব্যবহারকারী স্পষ্টভাবে লগ আউট না করে তবে এটি কার্যকর করা কঠিন হতে পারে, তাই এটির জন্য টাইমার সেট করা যেতে পারে।
সেটটাইমার () এবং ক্লিয়ারটাইমারের () টি সম্পর্কে এখানে একটি ভাল টিউটোরিয়াল ।
পিএইচপি সেশন এবং সিকিউরিটির (সেশন হাইজ্যাকিং ছাড়াও) প্রধান সমস্যাটি আপনি কী পরিবেশে রয়েছেন তা নিয়ে আসে default ডিফল্টরূপে পিএইচপি ওএসের টেম্প ডিরেক্টরিতে একটি ফাইলে সেশন ডেটা সংরক্ষণ করে। কোনও বিশেষ চিন্তা বা পরিকল্পনা ছাড়াই এটি একটি বিশ্ব পঠনযোগ্য ডিরেক্টরি যা আপনার সেশনের সমস্ত তথ্য সার্ভারে অ্যাক্সেস সহ যে কারও কাছে প্রকাশ্য।
একাধিক সার্ভারের উপর সেশন বজায় রাখা হিসাবে। এই মুহুর্তে পিএইচপি ব্যবহারকারীর দ্বারা পরিচালিত সেশনগুলিতে স্যুইচ করা ভাল হবে যেখানে এটি আপনার প্রদত্ত ফাংশনগুলিকে সিআরইউডিতে (তৈরি করুন, পড়ুন, আপডেট করুন, মুছুন) সেশন ডেটা হিসাবে কল করবেন। সেই সময়ে আপনি সেশন সম্পর্কিত তথ্য একটি ডাটাবেসে বা মেমক্যাশে সমাধানের মতো সঞ্চয় করতে পারেন যাতে সমস্ত অ্যাপ্লিকেশন সার্ভারের ডেটাতে অ্যাক্সেস থাকে।
আপনি যদি একটি শেয়ার্ড সার্ভারে থাকেন তবে নিজের সেশনগুলি সংরক্ষণ করাও উপকারী হতে পারে কারণ এটি আপনাকে এটি ডাটাবেসে সংরক্ষণ করতে দেয় যা আপনি প্রায়শই ফাইল সিস্টেমের উপর নিয়ন্ত্রণ রাখেন।
আমি এইভাবে আমার সেশনগুলি সেট আপ করি-
লগ ইন পৃষ্ঠাতে:
$_SESSION['fingerprint'] = md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR']);
(একটি কনফিগার পৃষ্ঠায় সংজ্ঞাযুক্ত বাক্যাংশ)
তারপরে সাইটটির বাকী অংশ জুড়ে থাকা শিরোনামে:
session_start();
if ($_SESSION['fingerprint'] != md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR'])) {
session_destroy();
header('Location: http://website login page/');
exit();
}
session.cookie_httponly = 1
change session name from default PHPSESSID
X-XSS-Protection 1
X-XSS-Protection
আসলেই কার্যকর নয়। প্রকৃতপক্ষে, সুরক্ষা অ্যালগরিদম নিজেই ব্যবহার করা যেতে পারে, এটি এটিকে আগের চেয়ে খারাপ করে তোলে।
আমি এবং আইপি এবং ব্যবহারকারী এজেন্ট উভয়ই চেক করে দেখি তারা পরিবর্তন হয় কিনা
if ($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']
|| $_SESSION['user_ip'] != $_SERVER['REMOTE_ADDR'])
{
//Something fishy is going on here?
}
আপনি যদি সেশন_সেট_সেভ_হ্যান্ডলার () ব্যবহার করেন তবে আপনি নিজের সেশন হ্যান্ডলারটি সেট করতে পারেন। উদাহরণস্বরূপ আপনি ডাটাবেসে আপনার সেশনগুলি সঞ্চয় করতে পারেন। একটি ডাটাবেস সেশন হ্যান্ডলারের উদাহরণগুলির জন্য পিএইচপি.এন.এল মন্তব্যসমূহ দেখুন।
আপনার যদি একাধিক সার্ভার থাকে তবে ডিবি সেশনগুলিও ভাল otherwise অন্যথায় যদি আপনি ফাইল ভিত্তিক সেশনগুলি ব্যবহার করেন তবে আপনার অবশ্যই নিশ্চিত করতে হবে যে প্রতিটি ওয়েবসারকে সেশনগুলি পড়ার / লেখার জন্য একই ফাইল সিস্টেমের অ্যাক্সেস রয়েছে।
আপনার নিশ্চিত হওয়া দরকার যে সেশন ডেটা নিরাপদ। আপনার php.ini দেখে বা phpinfo () ব্যবহার করে আপনি সেশন সেটিংস খুঁজে পেতে পারেন। _অ্যাসিওন.সেভ_পাথ_ আপনাকে জানায় তারা কোথায় রক্ষা পেয়েছে।
ফোল্ডার এবং এর পিতামাতার অনুমতি পরীক্ষা করুন। এটি সর্বজনীন (/ tmp) হওয়া বা আপনার ভাগ করা সার্ভারে অন্য ওয়েবসাইটগুলি অ্যাক্সেসযোগ্য হওয়া উচিত নয়।
ধরে নিই যে আপনি এখনও পিএইচপি সেশনটি ব্যবহার করতে চান, আপনি পিএইচপি সেট করতে পারেন অন্য ফোল্ডারটি ব্যবহার করে _session.save_path_ পরিবর্তন করে বা _session.save_handler_ পরিবর্তন করে ডাটাবেসে ডেটা সংরক্ষণ করতে।
আপনি (কিছু প্রদানকারীর এটি অনুমোদন) অথবা Apache + + mod_php জন্য আপনার php.ini মধ্যে _session.save_path_ সেট করতে সক্ষম হতে পারেন আপনার সাইটের রুট ফোল্ডারে একটি .htaccess ফাইলে:
php_value session.save_path "/home/example.com/html/session"
। আপনি _ নির্ধারণ_সেভ_পাথ () _ দিয়ে রান সময়ে এটি সেট করতে পারেন।
পরীক্ষা করে দেখুন ক্রিস Shiflett টিউটোরিয়াল বা Zend_Session_SaveHandler_DbTable সেট এবং বিকল্প অধিবেশন হ্যান্ডলার করতে।