পিএইচপি সেশন সুরক্ষা


125

পিএইচপি দিয়ে দায়বদ্ধ সেশন সুরক্ষা বজায় রাখার জন্য কিছু গাইডলাইন কি? সমস্ত ওয়েবে তথ্য রয়েছে এবং এটি প্রায় একই জায়গায় সমস্ত এক জায়গায় নেমেছে!

উত্তর:


88

আপনার সেশনটি সুরক্ষিত রাখতে কয়েকটি জিনিস করতে হবে:

  1. ব্যবহারকারীদের প্রমাণীকরণ বা সংবেদনশীল ক্রিয়াকলাপ সম্পাদনের সময় এসএসএল ব্যবহার করুন।
  2. যখনই সুরক্ষা স্তর পরিবর্তন হয় (যেমন লগ ইন করা) সেশন আইডি পুনরায় জেনারেট করুন। আপনি যদি চান তবে সেশন আইডি প্রতিটি অনুরোধ পুনরায় জেনারেট করতে পারেন।
  3. সেশন সময় শেষ
  4. বিশ্বব্যাপী রেজিস্টার ব্যবহার করবেন না
  5. সার্ভারে প্রমাণীকরণের বিশদ সংরক্ষণ করুন। তা হল, কুকিতে ব্যবহারকারীর নাম হিসাবে বিশদটি প্রেরণ করবেন না।
  6. পরীক্ষা করুন $_SERVER['HTTP_USER_AGENT']। এটি সেশন হাইজ্যাকিংয়ে একটি ছোট বাধা যুক্ত করে। আপনি আইপি ঠিকানাও পরীক্ষা করতে পারেন। তবে এটি একাধিক ইন্টারনেট সংযোগ ইত্যাদিতে লোড ব্যালেন্সিং ইত্যাদির কারণে আইপি অ্যাড্রেস পরিবর্তনকারী ব্যবহারকারীদের জন্য সমস্যা সৃষ্টি করে (যা আমাদের পরিবেশের ক্ষেত্রে এটিই রয়েছে)।
  7. ফাইল সিস্টেমে সেশনগুলিতে অ্যাক্সেস লক ডাউন করুন বা কাস্টম সেশন হ্যান্ডলিং ব্যবহার করুন
  8. সংবেদনশীল ক্রিয়াকলাপগুলির জন্য লগ ইন করা ব্যবহারকারীদের আবার তাদের প্রমাণীকরণের বিশদ সরবরাহ করার প্রয়োজন মনে করুন

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

6
-1 ব্যবহারকারীর এজেন্ট ছদ্মবেশের জন্য তুচ্ছ। আপনি যা বর্জ্য কোড বর্ণনা করছেন এবং এটি কোনও সুরক্ষা ব্যবস্থা নয়।
রোক

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

5
@grom আমি তোমার দরজা জুড়ে স্কটল্যাণ্ডের টেপ এক টুকরা নির্বাণ এবং বলছে এটি ভঙ্গ থেকে মানুষ প্রতিরোধ করবে চিন্তা তার।
দিয়ে পানি পড়া

8
আপনি যদি ব্যবহারকারী এজেন্টটি পরীক্ষা করছেন, আপনি IE8 ব্যবহারকারীদের সমস্ত অনুরোধগুলি যখন সামঞ্জস্যতা মোডে টগল করবেন তখন আপনি তাদের ব্লক করবেন। আমার নিজের কোডটিতে এই সমস্যাটি আমি খুঁজে পেয়েছি এমন মজা দেখুন: serverfault.com/questions/200018/http-302-problem-on-ie7 । আমি ব্যবহারকারীর এজেন্টটি পরীক্ষা করে নিচ্ছি, কারণ অন্যরা যেমন বলেছে তেমনি এটি তুচ্ছ জিনিস।
bestattendance

15

একটি নির্দেশিকা হ'ল প্রতিটি সময় সেশনের সুরক্ষা স্তরের পরিবর্তনের সময় সেশন_জেনারে_টি কল করা । এটি সেশন হাইজ্যাকিং প্রতিরোধে সহায়তা করে।


11

আমার দুটি (বা আরও) সেন্ট:

এই বিষয়টিতে একটি ছোট্ট তবে ভাল বই রয়েছে: ক্রিস শিফলেট দ্বারা আবশ্যক পিএইচপি সুরক্ষা

জরুরি পিএইচপি সুরক্ষা

বইয়ের হোম পেজে আপনি কয়েকটি আকর্ষণীয় কোড উদাহরণ এবং নমুনা অধ্যায় পাবেন।

আপনি এখানে বর্ণিত (আইপি এবং ইউজার এজেন্ট) প্রযুক্তি ব্যবহার করতে পারেন: কীভাবে পরিচয় চুরি এড়ানো যায়


এক্সএসএস-প্রতিরোধের জন্য +1। তা ছাড়া সিএসআরএফের বিরুদ্ধে রক্ষা করা অসম্ভব এবং এভাবে কেউ সেশন আইডি না পেয়ে সেশনটিকে "চালনা" করতে পারে।
কর্নেল

11

আমি মনে করি যে প্রধান সমস্যাগুলির মধ্যে একটি (যা পিএইচপি 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');

2
এটার প্রশ্নের সাথে মোটেই কোনও সম্পর্ক নেই।
পিক্সেল বিকাশকারী

5
সত্যি? তাহলে কেন তারা গৃহীত উত্তরে রেজিস্টার গ্লোবাল ব্যবহার না করার কথা উল্লেখ করে? যতক্ষণ না মিলের বেশিরভাগ রান-অফ-দ্য মিল-বিকাশকারীরা উদ্বিগ্ন, গ্লোবালগুলি নিবন্ধন করে এবং ভেরিয়েবল হ্যান্ডলিং "সেশন" এর ছত্রছায়ায় পতিত করে এমনকি এটি প্রযুক্তিগতভাবে "সেশন" অবজেক্টের অংশ না হলেও?
সে.এম.সি.কুলোহ

9
আমি সম্মত, এটি পুরোপুরি প্রশ্নের উত্তর দেয় না , তবে এটি অবশ্যই প্রশ্নের উত্তরটির অংশ। আবার এটি স্বীকৃত উত্তরে একটি বুলেট পয়েন্ট বের করে দেয়, "রেজিস্টার গ্লোবাল ব্যবহার করবেন না"। এটি পরিবর্তে কী করতে হবে তা বলে।
সে.এম.সি.কুলোহ


5

আইপি ঠিকানা ব্যবহার করা আমার অভিজ্ঞতার পক্ষে সর্বোত্তম ধারণা নয়। উদাহরণ স্বরূপ; আমার অফিসে দুটি আইপি ঠিকানা রয়েছে যা লোডের উপর নির্ভর করে ব্যবহার করা হয় এবং আমরা আইপি অ্যাড্রেসগুলি ব্যবহার করে প্রতিনিয়ত সমস্যাগুলিতে চলে যাই।

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


3

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

সেটটাইমার () এবং ক্লিয়ারটাইমারের () টি সম্পর্কে এখানে একটি ভাল টিউটোরিয়াল


3

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

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

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


3

আমি এইভাবে আমার সেশনগুলি সেট আপ করি-

লগ ইন পৃষ্ঠাতে:

$_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();     
}

3

php.ini

session.cookie_httponly = 1
change session name from default PHPSESSID

একা অ্যাপাচি হেডার যুক্ত করুন:

X-XSS-Protection    1

httpd.conf -> <ফাইলম্যাচ "\। (পিএইচপি | পিএইচটিএমএল | এসপিএক্স | এইচটিএমএল) $"> শিরোনামটি এক্স-এক্সএসএস-সুরক্ষা "1" </filesMatch> সেট করুন
ব্যবহারকারী 956584

সচেতন থাকুন যা X-XSS-Protectionআসলেই কার্যকর নয়। প্রকৃতপক্ষে, সুরক্ষা অ্যালগরিদম নিজেই ব্যবহার করা যেতে পারে, এটি এটিকে আগের চেয়ে খারাপ করে তোলে।
পেসারিয়ার

2

আমি এবং আইপি এবং ব্যবহারকারী এজেন্ট উভয়ই চেক করে দেখি তারা পরিবর্তন হয় কিনা

if ($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']
    || $_SESSION['user_ip'] != $_SERVER['REMOTE_ADDR'])
{
    //Something fishy is going on here?
}

5
ব্যবহারকারী লোড-ভারসাম্য প্রক্সি ফার্মের পিছনে থাকলে আইপি বৈধভাবে পরিবর্তন করতে পারে।
কর্নেল

2
এবং ব্যবহারকারী_এজেন্ট প্রতিটি সময় তাদের ব্রাউজার আপগ্রেড করতে পরিবর্তন করতে পারে।
স্কটগুলি

3
@ স্কটস আমি আইপি অংশের সাথে একমত কিন্তু ব্রাউজার আপগ্রেডের জন্য, তারা লগইন করার সময় আপনি সেশনটি সেট করে দিতেন যাতে তারা আবার লগইন করে একবার নতুন সেশন তৈরি না করে তারা সেখানে ব্রাউজারকে কীভাবে আপগ্রেড করবে তা আমি দেখতে পাই না।
জেসনডাভিস

আমি বিশ্বাস করি আইই 8-তে তুলনামূলক মোডের মধ্যে টগল করার সময় ব্যবহারকারী_এজেন্টটিও পরিবর্তন করতে পারে। এটি জাল করা খুব সহজ।

হ্যাঁ তবে স্ট্যাটিক আইপি একিউ জিএসএম থাকা ব্যবহারকারীদের কী হবে এবং প্রতি আধ ঘন্টা পরে পরিবর্তন করা হয়। সুতরাং, সেশন + হোস্টের নামে আইপি সংরক্ষণ করা হয়েছে, WHEN আইপি! = REMOTE_ADDR হোস্ট চেক করুন এবং হোস্টানমেস একের সাথে তুলনা করুন। 12.12.12.holand.nl-> হল্যান্ড.এনএল == সত্য হলে। তবে কিছু হোস্টের আইপি ভিত্তিক হোস্টনাম ছিল তারপরে 88.99.XX.XX
ইউজার 956584

2

আপনি যদি সেশন_সেট_সেভ_হ্যান্ডলার () ব্যবহার করেন তবে আপনি নিজের সেশন হ্যান্ডলারটি সেট করতে পারেন। উদাহরণস্বরূপ আপনি ডাটাবেসে আপনার সেশনগুলি সঞ্চয় করতে পারেন। একটি ডাটাবেস সেশন হ্যান্ডলারের উদাহরণগুলির জন্য পিএইচপি.এন.এল মন্তব্যসমূহ দেখুন।

আপনার যদি একাধিক সার্ভার থাকে তবে ডিবি সেশনগুলিও ভাল otherwise অন্যথায় যদি আপনি ফাইল ভিত্তিক সেশনগুলি ব্যবহার করেন তবে আপনার অবশ্যই নিশ্চিত করতে হবে যে প্রতিটি ওয়েবসারকে সেশনগুলি পড়ার / লেখার জন্য একই ফাইল সিস্টেমের অ্যাক্সেস রয়েছে।


2

আপনার নিশ্চিত হওয়া দরকার যে সেশন ডেটা নিরাপদ। আপনার 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 সেট এবং বিকল্প অধিবেশন হ্যান্ডলার করতে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.