3 طرق لإنشاء نظام إدارة جلسات آمن في PHP و MySQL

جدول المحتويات:

3 طرق لإنشاء نظام إدارة جلسات آمن في PHP و MySQL
3 طرق لإنشاء نظام إدارة جلسات آمن في PHP و MySQL

فيديو: 3 طرق لإنشاء نظام إدارة جلسات آمن في PHP و MySQL

فيديو: 3 طرق لإنشاء نظام إدارة جلسات آمن في PHP و MySQL
فيديو: احصل على وظيفة بقيمة 250 ألف دولار هذا العام! (دورة هندسة الأوامر Prompt ) 2024, أبريل
Anonim

سيوضح لك هذا الدليل كيف يمكنك تخزين جلساتك بأمان في قاعدة بيانات mySQL. سنقوم أيضًا بتشفير جميع بيانات الجلسة التي تدخل إلى قاعدة البيانات ، مما يعني أنه إذا تمكن أي شخص من اختراق قاعدة البيانات ، فسيتم تشفير جميع بيانات الجلسة بواسطة تشفير 256 بت AES.

خطوات

الطريقة الأولى من 3: تكوين قاعدة بيانات mySQL

2238751 1
2238751 1

الخطوة 1. أنشئ قاعدة بيانات MySQL

في هذا الدليل سننشئ قاعدة بيانات تسمى "secure_sessions".

تعرف على كيفية إنشاء قاعدة بيانات في phpMyAdmin.

أو يمكنك استخدام كود SQL أدناه لإنشاء واحد لك.

إنشاء كود قاعدة البيانات:

إنشاء قاعدة بيانات "secure_sessions" ؛

ملاحظة: لا تسمح لك بعض خدمات الاستضافة بإنشاء قاعدة بيانات من خلال phpMyAdmin ، تعرف على كيفية القيام بذلك في cPanel.

2238751 2
2238751 2

الخطوة 2. قم بإنشاء مستخدم بامتيازات SELECT و INSERT و DELETE فقط

هذا يعني أنه إذا كان هناك خرق للأمان في البرنامج النصي الخاص بنا ، فلن يتمكن المخترق من إسقاط الجداول من قاعدة البيانات الخاصة بنا. إذا كنت حقًا مصابًا بجنون العظمة ، فقم بإنشاء مستخدم مختلف لكل وظيفة.

  • مستخدم:

    "sec_user"

  • كلمه السر:

    "eKcGZr59zAa2BEWU"

إنشاء رمز المستخدم:

إنشاء مستخدم 'sec_user' @ 'localhost' تم تحديده بواسطة 'eKcGZr59zAa2BEWU' ؛ GRANT SELECT، INSERT، UPDATE، DELETE ON secure_sessions`. * TO 'sec_user' @ 'localhost' ؛

ملاحظة: من الجيد تغيير كلمة المرور في الكود أعلاه عند التشغيل على الخادم الخاص بك. (تأكد من تغيير رمز PHP الخاص بك أيضًا.) تذكر أنه لا يلزم أن تكون كلمة مرور يمكنك تذكرها ، لذا اجعلها معقدة قدر الإمكان. إليك مولد كلمة مرور عشوائي.

2238751 3
2238751 3

الخطوة الثالثة. قم بإنشاء جدول MySQL باسم "Session"

يُنشئ الكود أدناه جدولًا يحتوي على 4 حقول (id ، set_time ، data ، session_key).

أنشئ جدول "الجلسات":

إنشاء جدول "جلسات" (`id` char (128) NOT NULL،` set_time` char (10) NOT NULL، `data` text NOT NULL،` session_key` char (128) NOT NULL، PRIMARY KEY (`id`)) المحرك = مجموعة InnoDB الافتراضية = latin1 ؛

نستخدم نوع بيانات CHAR للحقول التي نعرف طولها ، حيث سيكون طول الحقلين "id" و "session_key" دائمًا 128 حرفًا. استخدام CHAR هنا يوفر قوة المعالجة.

الطريقة الثانية من 3: إنشاء ملف session.class.php

2238751 4
2238751 4

الخطوة 1. إنشاء فصل دراسي

لبدء فصل جديد ، ستحتاج إلى إدخال الرمز أدناه:

صف جديد:

جلسة الفصل {

2238751 5
2238751 5

الخطوة 2. إنشاء وظيفة _construct

سيتم استدعاء هذه الوظيفة في كل مرة نقوم فيها بإنشاء مثيل جديد لكائن باستخدام فئة "session". يمكنك القراءة عن وظيفة _construct PHP هنا.

تقوم هذه الوظيفة بتعيين معالج الجلسة المخصص الخاص بنا بحيث يكون متاحًا للاستخدام بمجرد إنشاء الفئة (على سبيل المثال ، صنع / مبني / مُنشأ).

_construct وظيفة:

function _construct () {// اضبط وظائف الجلسة المخصصة. session_set_save_handler (المصفوفة ($ this، 'open')، المصفوفة ($ this، 'close')، المصفوفة ($ this، 'read')، المصفوفة ($ this، 'write')، المصفوفة ($ this، 'destruction') ، المصفوفة ($ this، 'gc'))؛ // يمنع هذا الخط التأثيرات غير المتوقعة عند استخدام الكائنات كمعالجات حفظ. register_shutdown_function ('session_write_close') ؛ }

2238751 6
2238751 6

الخطوة 3. إنشاء وظيفة start_session

سيتم استدعاء هذه الوظيفة في كل مرة تريد فيها بدء جلسة جديدة ، استخدمها بدلاً من session_start () ؛. انظر إلى التعليقات في الكود لمعرفة ما يفعله كل سطر.

وظيفة بدء الجلسة:

function start_session ($ session_name، $ secure) {// تأكد من أن ملف تعريف ارتباط الجلسة لا يمكن الوصول إليه عبر جافا سكريبت. httponly $ = صحيح ؛ // خوارزمية تجزئة لاستخدامها في الجلسة. (استخدم hash_algos () للحصول على قائمة التجزئات المتاحة.) $ session_hash = 'sha512'؛ // تحقق مما إذا كانت التجزئة متاحة إذا (in_array ($ session_hash، hash_algos ())) {// عيِّن وظيفة has. ini_set ('session.hash_function'، $ session_hash) ؛ } // كم عدد وحدات البت لكل حرف من أحرف التجزئة. // القيم المحتملة هي '4' (0-9 ، a-f) ، '5' (0-9 ، a-v) ، و '6' (0-9 ، a-z ، A-Z ، "-" ، "،"). ini_set ('session.hash_bits_per_character'، 5) ؛ // إجبار الجلسة على استخدام ملفات تعريف الارتباط فقط ، وليس متغيرات عنوان URL. ini_set ('session.use_only_cookies'، 1) ؛ // الحصول على معلمات ملفات تعريف الارتباط للجلسة $ cookieParams = session_get_cookie_params () ؛ // تعيين المعلمات session_set_cookie_params ($ cookieParams ["lifetime"] ، $ cookieParams ["path"] ، $ cookieParams ["domain"] ، $ secure ، $ httponly)؛ // تغيير اسم الجلسة session_name ($ session_name) ؛ // الآن نبدأ الجلسة session_start () ؛ // هذا السطر يعيد إنشاء الجلسة ويحذف القديم. // يقوم أيضًا بإنشاء مفتاح تشفير جديد في قاعدة البيانات. session_regenerate_id (صواب) ؛ }

2238751 7
2238751 7

الخطوة 4. إنشاء وظيفة مفتوحة

سيتم استدعاء هذه الوظيفة بواسطة جلسات PHP عندما نبدأ جلسة جديدة ، نستخدمها لبدء اتصال قاعدة بيانات جديد.

وظيفة مفتوحة:

دالة مفتوحة () {$ host = 'localhost'؛ المستخدم $ = 'sec_user' ؛ تمرير $ = 'eKcGZr59zAa2BEWU' ؛ $ name = 'secure_sessions'؛ $ mysqli = mysqli جديد ($ host، $ user، $ pass، $ name)؛ $ this-> db = $ mysqli؛ العودة صحيح }

2238751 8
2238751 8

الخطوة 5. إنشاء وظيفة قريبة

سيتم استدعاء هذه الوظيفة عندما تريد إغلاق الجلسات.

وظيفة قريبة:

دالة close () {$ this-> db-> close ()؛ العودة صحيح }

2238751 9
2238751 9

الخطوة 6. إنشاء وظيفة القراءة

سيتم استدعاء هذه الوظيفة بواسطة PHP عندما نحاول الوصول إلى جلسة على سبيل المثال عندما نستخدم echo $ _SESSION ['something'] ؛. نظرًا لأنه قد يكون هناك العديد من الاستدعاءات لهذه الوظيفة على صفحة واحدة ، فإننا نستفيد من البيانات المعدة ، ليس فقط للأمان ولكن للأداء أيضًا. نقوم بإعداد البيان مرة واحدة فقط ثم يمكننا تنفيذه عدة مرات.

نقوم أيضًا بفك تشفير بيانات الجلسة المشفرة في قاعدة البيانات. نحن نستخدم تشفير 256 بت AES في جلساتنا.

قراءة وظيفة:

وظيفة قراءة ($ id) {if (! isset ($ this-> read_stmt)) {$ this-> read_stmt = $ this-> db-> تحضير ("حدد البيانات من الجلسات WHERE id =؟ LIMIT 1") ؛ } $ this-> read_stmt-> bind_param ('s'، $ id)؛ $ this-> read_stmt-> execute ()؛ $ this-> read_stmt-> store_result () ؛ $ this-> read_stmt-> bind_result ($ data)؛ $ this-> read_stmt-> fetch ()؛ $ key = $ this-> getkey ($ id) ؛ بيانات $ = $ this-> فك تشفير ($ data، $ key)؛ إرجاع البيانات $؛ }

2238751 10
2238751 10

الخطوة 7. إنشاء وظيفة الكتابة

تُستخدم هذه الوظيفة عندما نقوم بتعيين قيمة لجلسة ، على سبيل المثال $ _SESSION ['شيء'] = 'شيء آخر' ؛. تقوم الوظيفة بتشفير جميع البيانات التي يتم إدخالها في قاعدة البيانات.

وظيفة الكتابة:

كتابة الوظيفة ($ id، $ data) {// Get unique key $ key = $ this-> getkey ($ id)؛ // تشفير البيانات $ data = $ this-> encrypt ($ data، $ key) ؛ الوقت بالدولار = الوقت () ؛ if (! isset ($ this-> w_stmt)) {$ this-> w_stmt = $ this-> db-> تحضير ("REPLACE INTO Session (id، set_time، data، session_key) VALUES (؟،؟،؟،؟) ") ؛ } $ this-> w_stmt-> bind_param ('siss'، $ id، $ time، $ data، $ key)؛ $ this-> w_stmt-> تنفيذ () ؛ العودة صحيح }

2238751 11
2238751 11

الخطوة 8. إنشاء وظيفة التدمير

هذه الوظيفة تحذف الجلسة من قاعدة البيانات ، وتستخدمها php عندما نسمي دوال مثل session_destroy () ؛.

تدمير وظيفة:

وظيفة تدمير ($ id) {if (! isset ($ this-> delete_stmt)) {$ this-> delete_stmt = $ this-> db-> PreparE ("DELETE من الجلسات WHERE id =؟")؛ } $ this-> delete_stmt-> bind_param ('s'، $ id)؛ $ this-> delete_stmt-> execute ()؛ العودة صحيح }

2238751 12
2238751 12

الخطوة 9. إنشاء وظيفة gc (جامع القمامة)

هذه الوظيفة هي وظيفة جامع القمامة وهي تسمى لحذف الجلسات القديمة. يتم تحديد التردد الذي يتم من خلاله استدعاء هذه الوظيفة من خلال توجيهين للتهيئة ، جلسة. gc_probability و session.gc_divisor.

وظيفة gc ():

function gc ($ max) {if (! isset ($ this-> gc_stmt)) {$ this-> gc_stmt = $ this-> db-> PreparE ("DELETE FROM Session WHERE set_time <؟")؛ } $ old = time () - $ max ؛ $ this-> gc_stmt-> bind_param ($ old)؛ $ this-> gc_stmt-> تنفيذ () ؛ العودة صحيح }

2238751 13
2238751 13

الخطوة 10. إنشاء وظيفة getKey

تُستخدم هذه الوظيفة للحصول على المفتاح الفريد للتشفير من جدول الجلسات. في حالة عدم وجود جلسة ، تقوم فقط بإرجاع مفتاح عشوائي جديد للتشفير.

وظيفة getkey ():

وظيفة خاصة getkey ($ id) {if (! isset ($ this-> key_stmt)) {$ this-> key_stmt = $ this-> db-> Prepar ("SELECT session_key FROM Session WHERE id =؟ LIMIT 1")؛ } $ this-> key_stmt-> bind_param ('s'، $ id)؛ $ this-> key_stmt-> تنفيذ () ؛ $ this-> key_stmt-> store_result () ؛ إذا ($ this-> key_stmt-> num_rows == 1) {$ this-> key_stmt-> bind_result ($ key) ؛ $ this-> key_stmt-> fetch ()؛ عودة مفتاح $؛ } else {$ random_key = hash ('sha512'، uniqid (mt_rand (1، mt_getrandmax ())، true)) ؛ إرجاع $ random_key؛ }}

2238751 14
2238751 14

الخطوة 11. إنشاء وظائف التشفير وفك التشفير

تقوم هذه الوظائف بتشفير بيانات الجلسات ، وتستخدم مفتاح تشفير من قاعدة البيانات يختلف لكل جلسة. لا نستخدم هذا المفتاح بشكل مباشر في التشفير ولكننا نستخدمه لجعل تجزئة المفتاح أكثر عشوائية.

تشفير () وفك تشفير () وظائف:

تشفير الوظيفة الخاصة ($ data، $ key) {$ salt = 'cH! swe! retReGu7W6bEDRup7usuDUh9THeD2CHeGE * ewr4n39 = E @ rAsp7c-Ph @ pH'؛ $ key = substr (التجزئة ('sha256'، $ salt. $ key. $ salt)، 0، 32) ؛ $ iv_size = mcrypt_get_iv_size (MCRYPT_RIJNDAEL_256، MCRYPT_MODE_ECB) ، $ iv = mcrypt_create_iv ($ iv_size ، MCRYPT_RAND) ؛ $ encrypted = base64_encode (mcrypt_encrypt (MCRYPT_RIJNDAEL_256، $ key، $ data، MCRYPT_MODE_ECB، $ iv)) ؛ العودة المشفرة $؛ } فك تشفير الوظيفة الخاصة ($ data، $ key) {$ salt = 'cH! swe! retReGu7W6bEDRup7usuDUh9THeD2CHeGE * ewr4n39 = E @ rAsp7c-Ph @ pH'؛ $ key = substr (التجزئة ('sha256'، $ salt. $ key. $ salt)، 0، 32) ؛ $ iv_size = mcrypt_get_iv_size (MCRYPT_RIJNDAEL_256، MCRYPT_MODE_ECB) ، $ iv = mcrypt_create_iv ($ iv_size ، MCRYPT_RAND) ؛ $ decrypted = mcrypt_decrypt (MCRYPT_RIJNDAEL_256، $ key، base64_decode ($ data)، MCRYPT_MODE_ECB، $ iv) ؛ فك تشفير $ = rtrim (تم فك تشفير $ ، "\ 0")؛ إعادة فك تشفير $؛ }

2238751 15
2238751 15

الخطوة 12. إنهاء الفصل

هنا ننهي الفئات المتعرجة بين قوسين:

فئة النهاية:

}

الطريقة الثالثة من 3: إنشاء الصفحات باستخدام الجلسات

2238751 16
2238751 16

الخطوة 1. استخدام الجلسات مع مدير الجلسة المخصص

فيما يلي كيف ستبدأ جلسة جديدة ؛ ستحتاج إلى تضمين هذا في كل صفحة تريد الوصول إلى الجلسات ، استخدمه بدلاً من session_start () ؛

بدء الجلسة:

تتطلب ("session.class.php") ؛ جلسة $ = جلسة جديدة () ؛ // اضبط على صواب في حالة استخدام https $ session-> start_session ('_ s'، false) ؛ $ _SESSION ['شيء'] = 'قيمة.'؛ صدى $ _SESSION ["شيء"] ؛

موصى به: