3 راه برای ایجاد یک سیستم مدیریت جلسه امن در PHP و MySQL

فهرست مطالب:

3 راه برای ایجاد یک سیستم مدیریت جلسه امن در PHP و MySQL
3 راه برای ایجاد یک سیستم مدیریت جلسه امن در PHP و MySQL

تصویری: 3 راه برای ایجاد یک سیستم مدیریت جلسه امن در PHP و MySQL

تصویری: 3 راه برای ایجاد یک سیستم مدیریت جلسه امن در PHP و MySQL
تصویری: مسیر و مدت زمان یادگیری برنامه نویسی وب (چکیده ای از 20 سال تجربه) 2024, آوریل
Anonim

این راهنما به شما نشان می دهد که چگونه می توانید جلسات خود را به صورت ایمن در پایگاه داده mySQL ذخیره کنید. ما همچنین تمام داده های جلسه را که وارد پایگاه داده می شود رمزگذاری می کنیم ، بدین معنا که اگر کسی موفق به هک پایگاه داده شود ، تمام داده های جلسه با رمزگذاری 256 بیتی AES رمزگذاری می شود.

مراحل

روش 1 از 3: پیکربندی پایگاه داده mySQL

2238751 1
2238751 1

مرحله 1. یک پایگاه داده MySQL ایجاد کنید

در این راهنما ما یک پایگاه داده به نام "safe_sessions" ایجاد می کنیم.

نحوه ایجاد یک پایگاه داده در phpMyAdmin را مشاهده کنید.

یا می توانید از کد SQL زیر استفاده کنید تا یکی برای شما ایجاد شود.

ایجاد کد پایگاه داده:

ایجاد پایگاه داده `safe_sessions`؛

توجه: برخی از خدمات میزبانی به شما اجازه ایجاد پایگاه داده از طریق phpMyAdmin را نمی دهند ، نحوه انجام آن را در cPanel بیاموزید.

2238751 2
2238751 2

مرحله 2. ایجاد یک کاربر با تنها SELECT ، INSERT و DELETE امتیازات

این بدان معناست که در صورت نقض امنیت در اسکریپت ما ، هکر نمی تواند جداول را از پایگاه داده ما حذف کند. اگر واقعاً پارانوئید هستید ، برای هر تابع یک کاربر متفاوت ایجاد کنید.

  • کاربر:

    "sec_user"

  • کلمه عبور:

    "eKcGZr59zAa2BEWU"

ایجاد کد کاربری:

CREATE USER 'sec_user'@'localhost' IDENTIFIED BY 'eKcGZr59zAa2BEWU'؛ GRANT SELECT ، INSERT ، UPDATE ، DELETE ON `safe_session`.* به 'sec_user'@'localhost' ؛

توجه: بهتر است در هنگام اجرا بر روی سرور خود رمز عبور را در کد بالا تغییر دهید. (اطمینان حاصل کنید که کد PHP خود را نیز تغییر داده اید.) به یاد داشته باشید که نیازی به گذرواژه ای نیست که بتوانید آن را به خاطر بسپارید ، بنابراین تا حد امکان پیچیده باشد. در اینجا یک تولید کننده رمز عبور تصادفی است.

2238751 3
2238751 3

مرحله 3. یک جدول MySQL با نام "session" ایجاد کنید

کد زیر جدولی با 4 فیلد (id ، set_time ، data ، session_key) ایجاد می کند.

جدول "session" را ایجاد کنید:

ایجاد جدول «جلسات» (`id` char (128) NOT NULL ،` set_time` char (10) NOT NULL ، `data` NOT NOT NULL ،` session_key` char (128) NOT NULL ، PRIMARY KEY (`id`)) ENGINE = InnoDB CHARSET DEFAULT = latin1؛

ما از نوع داده CHAR برای زمینه هایی که طول آنها را می دانیم استفاده می کنیم ، زیرا زمینه های "id" و "session_key" همیشه 128 کاراکتر خواهند بود. با استفاده از CHAR در قدرت پردازشی صرفه جویی می شود.

روش 2 از 3: ایجاد فایل session.class.php

2238751 4
2238751 4

مرحله 1. ایجاد کلاس

برای شروع کلاس جدید ، باید کد زیر را وارد کنید:

کلاس جدید:

جلسه کلاس {

2238751 5
2238751 5

مرحله 2. ایجاد تابع _construct

این تابع هر بار که یک نمونه جدید از یک شی با استفاده از کلاس 'session' ایجاد می کنیم فراخوانی می شود. می توانید تابع PHP _construct را در اینجا بخوانید.

این تابع مدیریت جلسه سفارشی ما را تنظیم می کند تا به محض ایجاد کلاس (یعنی ساخته/ساخته/ساخته) برای استفاده در دسترس باشد.

_ تابع ساخت:

تابع _construct () {// توابع جلسه سفارشی ما را تنظیم کنید. session_set_save_handler (array ($ this، 'open')، array ($ this، 'close')، array ($ this، 'read')، array ($ this، 'write')، array ($ this، 'نابود کردن')) ، آرایه ($ this ، 'gc'))؛ // این خط هنگام استفاده از اشیاء به عنوان کنترل کننده های ذخیره از جلوه های غیر منتظره جلوگیری می کند. Register_shutdown_function ('session_write_close')؛ }

2238751 6
2238751 6

مرحله 3. ایجاد تابع start_session

این تابع هر بار که می خواهید جلسه جدیدی را شروع کنید فراخوانی می شود ، به جای session_start ()؛ از آن استفاده کنید. نظرات موجود در کد را ببینید تا ببینید هر خط چه کار می کند.

تابع start_session:

تابع start_session ($ session_name ، $ safe) {// مطمئن شوید که کوکی جلسه از طریق جاوا اسکریپت قابل دسترسی نیست. $ httponly = true؛ // الگوریتم هش برای استفاده در جلسه. (از hash_algos () برای دریافت لیستی از هش های موجود استفاده کنید.) $ session_hash = 'sha512'؛ // بررسی کنید آیا hash در دسترس است (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 ["مادام العمر"] ، $ cookieParams ["مسیر"] ، $ cookieParams ["دامنه"] ، $ امن ، $ httponly) ؛ // تغییر نام جلسه session_name ($ session_name) ؛ // حالا ما session را شروع می کنیم session_start ()؛ // این خط جلسه را دوباره ایجاد می کند و جلسه قبلی را حذف می کند. // همچنین یک کلید رمزگذاری جدید در پایگاه داده ایجاد می کند. session_regenerate_id (درست) ؛ }

2238751 7
2238751 7

مرحله 4. ایجاد تابع باز

وقتی یک جلسه جدید را شروع می کنیم ، این تابع توسط جلسات PHP فراخوانی می شود و از آن برای شروع اتصال پایگاه داده جدید استفاده می کنیم.

عملکرد باز:

تابع open () {$ host = 'localhost'؛ $ user = 'sec_user'؛ $ pass = 'eKcGZr59zAa2BEWU'؛ $ name = 'safe_sessions'؛ $ mysqli = mysqli جدید ($ host، $ user، $ pass، $ name)؛ $ this-> db = $ mysqli؛ بازگشت واقعی ؛ }

2238751 8
2238751 8

مرحله 5. ایجاد تابع close

هنگامی که جلسات می خواهند بسته شوند ، این تابع فراخوانی می شود.

تابع بستن:

تابع close () {$ this-> db-> close ()؛ بازگشت واقعی ؛ }

2238751 9
2238751 9

مرحله 6. ایجاد تابع خواندن

این تابع زمانی که سعی می کنیم به یک جلسه دسترسی داشته باشیم ، برای مثال هنگامی که از echo $ _SESSION ['چیزی'] استفاده می کنیم ، PHP فراخوانی می شود. از آنجا که ممکن است فراوانی فراخوانی این تابع در یک صفحه وجود داشته باشد ، ما از دستورات آماده شده نه تنها برای امنیت بلکه برای عملکرد نیز استفاده می کنیم. ما فقط یکبار دستور را آماده می کنیم سپس می توانیم آن را بارها اجرا کنیم.

ما همچنین داده های جلسه را که در پایگاه داده رمزگذاری شده است رمزگشایی می کنیم. ما در جلسات خود از رمزگذاری AES 256 بیتی استفاده می کنیم.

تابع خواندن:

تابع read ($ 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-> اجرا ()؛ $ this-> read_stmt-> store_result ()؛ $ this-> read_stmt-> bind_result ($ data) ؛ $ this-> read_stmt-> واکشی ()؛ $ key = $ this-> getkey ($ id)؛ $ data = $ this-> رمزگشایی ($ data، $ key)؛ $ data را برگرداند ؛ }

2238751 10
2238751 10

مرحله 7. ایجاد تابع نوشتن

این تابع زمانی استفاده می شود که ما یک مقدار را به یک جلسه اختصاص می دهیم ، برای مثال $ _SESSION ['something'] = 'something else' ؛. این تابع تمام داده هایی را که وارد پایگاه داده می شوند رمزگذاری می کند.

تابع نوشتن:

تابع نوشتن ($ id، $ data) {// دریافت کلید منحصر به فرد $ key = $ this-> getkey ($ id)؛ // رمزگذاری داده ها $ data = $ this-> رمزگذاری ($ data، $ key)؛ $ time = زمان ()؛ if (! isset ($ this-> w_stmt)) {$ this-> w_stmt = $ this-> db-> آماده سازی ("جایگزینی جلسات (شناسه ، زمان تنظیم ، داده ، کلید_صحبت) VALUES (؟ ،؟ ،؟ ،؟) ")؛ } $ this-> w_stmt-> bind_param ('siss'، $ id، $ time، $ data، $ key)؛ $ this-> w_stmt-> اجرا ()؛ بازگشت واقعی ؛ }

2238751 11
2238751 11

مرحله 8. ایجاد عملکرد نابود کردن

این تابع session را از پایگاه داده حذف می کند ، هنگامی که ما توابعی مانند session_destroy () را فراخوانی می کنیم ، توسط php استفاده می شود.

از بین بردن عملکرد:

تابع نابود ($ id) {if (! isset ($ this-> delete_stmt)) {$ this-> delete_stmt = $ this-> db-> آماده سازی ("حذف جلسات از کجا id =؟")؛ } $ this-> delete_stmt-> bind_param ('s'، $ id)؛ $ this-> delete_stmt-> اجرا ()؛ بازگشت واقعی ؛ }

2238751 12
2238751 12

مرحله 9. عملکرد gc (جمع آوری زباله) را ایجاد کنید

این تابع عملکرد جمع آوری زباله است که برای حذف جلسات قدیمی نامیده می شود. فراوانی فراخوانی این تابع توسط دو دستور پیکربندی ، session.gc_probability و session.gc_divisor تعیین می شود.

تابع gc ():

تابع gc ($ max) {if (! isset ($ this-> gc_stmt)) {$ this-> gc_stmt = $ this-> db-> آماده سازی ("حذف جلسات از کجا set_time <؟") ؛ } $ old = time () - $ max؛ $ this-> gc_stmt-> bind_param ('s' ، $ old)؛ $ this-> gc_stmt-> اجرا ()؛ بازگشت واقعی ؛ }

2238751 13
2238751 13

مرحله 10. ایجاد تابع getKey

این تابع برای دریافت کلید منحصر به فرد برای رمزگذاری از جدول جلسات استفاده می شود. اگر جلسه ای وجود نداشته باشد ، فقط یک کلید تصادفی جدید برای رمزگذاری برمی گرداند.

getkey () تابع:

عملکرد خصوصی getkey ($ id) {if (! isset ($ this-> key_stmt)) {$ this-> key_stmt = $ this-> db-> آماده سازی ("انتخاب کلید_جلسات از جلسات WHERE id =؟ LIMIT 1") ؛ } $ this-> key_stmt-> bind_param ('s'، $ id)؛ $ this-> key_stmt-> اجرا ()؛ $ this-> key_stmt-> store_result ()؛ if ($ this-> key_stmt-> num_rows == 1) {$ this-> key_stmt-> bind_result ($ key) ؛ $ this-> key_stmt-> واکشی ()؛ بازگشت کلید $ ؛ } 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) ؛ $ رمزگشایی = mcrypt_decrypt (MCRYPT_RIJNDAEL_256 ، $ key ، base64_decode ($ data) ، MCRYPT_MODE_ECB ، $ iv) ؛ $ رمزگشایی = rtrim ($ رمزگشایی ، "\ 0") ؛ $ رمزگشایی شده را بازگردانید ؛ }

2238751 15
2238751 15

مرحله 12. پایان کلاس

در اینجا ما فقط کلاس های پرانتز را خاتمه می دهیم:

پایان کلاس:

}

روش 3 از 3: ایجاد صفحات با جلسات

2238751 16
2238751 16

مرحله 1. استفاده از جلسات با مدیر جلسه سفارشی

در زیر نحوه شروع یک جلسه جدید است. لازم است این مورد را در هر صفحه ای که می خواهید به جلسات دسترسی داشته باشید درج کنید ، به جای session_start () از آن استفاده کنید؛

شروع جلسه:

نیاز ('session.class.php')؛ $ session = جلسه جدید ()؛ // در صورت استفاده از https $ session-> start_session ('_ s' ، false) روی true تنظیم می شود ؛ $ _SESSION ['something'] = 'یک مقدار.'؛ echo $ _SESSION ['چیزی']؛

توصیه شده: