PHP және MySQL -те қауіпсіз сеансты басқару жүйесін құрудың 3 әдісі

Мазмұны:

PHP және MySQL -те қауіпсіз сеансты басқару жүйесін құрудың 3 әдісі
PHP және MySQL -те қауіпсіз сеансты басқару жүйесін құрудың 3 әдісі

Бейне: PHP және MySQL -те қауіпсіз сеансты басқару жүйесін құрудың 3 әдісі

Бейне: PHP және MySQL -те қауіпсіз сеансты басқару жүйесін құрудың 3 әдісі
Бейне: Web-сайт құру және дизайны 2024, Сәуір
Anonim

Бұл нұсқаулық сіздің сеанстарыңызды mySQL дерекқорында қалай қауіпсіз сақтауға болатынын көрсетеді. Біз сондай-ақ дерекқорға кіретін барлық сеанстық деректерді шифрлаймыз, яғни егер кез келген адам дерекқорды бұза алса, барлық сеанс деректері 256 биттік AES шифрлауымен шифрланады.

Қадамдар

3 -ші әдіс 1: mySQL мәліметтер базасын конфигурациялау

2238751 1
2238751 1

Қадам 1. MySQL дерекқорын жасаңыз

Бұл нұсқаулықта біз «secure_sessions» деп аталатын мәліметтер базасын құрамыз.

PhpMyAdmin-де дерекқорды қалай жасау керектігін қараңыз.

Немесе сіз төмендегі SQL кодын қолдана аласыз, ол сізге біреуін жасайды.

Мәліметтер қорының кодын құру:

DATABASE `secure_sessions` жасау;

Ескерту: Кейбір хостинг қызметтері phpMyAdmin арқылы мәліметтер қорын құруға мүмкіндік бермейді, оны cPanel -де қалай жасау керектігін біліңіз.

2238751 2
2238751 2

Қадам 2. Тек SELECT, INSERT және DELETE артықшылықтары бар пайдаланушыны жасаңыз

Бұл дегеніміз, егер біздің сценарийімізде қауіпсіздік бұзылған болса, хакер кестені біздің дерекқордан алып тастай алмайды. Егер сіз шынымен параноид болсаңыз, әр функция үшін басқа пайдаланушы жасаңыз.

  • Қолданушы:

    «sec_user»

  • Құпия сөз:

    «eKcGZr59zAa2BEWU»

Пайдаланушы кодын жасау:

'EKcGZr59zAa2BEWU' анықтаған 'sec_user'@'localhost' пайдаланушысын жасаңыз; GRANT SELECT, INSERT, UPDATE, DELETE ON `secure_sessions`.* TO 'sec_user'@'localhost';

Ескерту: Жеке серверде жұмыс істеген кезде жоғарыдағы кодтағы құпия сөзді өзгерту жақсы. (PHP кодын да өзгерткеніңізге көз жеткізіңіз.) Есіңізде болсын, оны есте сақтауға болатын құпия сөз қажет емес, сондықтан жасау мүмкіндігінше күрделі. Бұл кездейсоқ пароль генераторы.

2238751 3
2238751 3

Қадам 3. «сеанстар» деп аталатын MySQL кестесін жасаңыз

Төмендегі код 4 өрістен тұратын кестені жасайды (id, set_time, data, session_key).

«Сеанстар» кестесін құрыңыз:

CREATE TABLE `сеанстары` (` id` char (128) NOT NULL, `set_time` char (10) NULL,` data` text NOT NULL, `session_key` char (128) NOT NULL, PRIMARY KEY (` id`)) ҚАЗАҚ = InnoDB әдепкі кестесі = latin1;

Біз CHAR деректер түрін біз білетін өрістер үшін қолданамыз, себебі «id» және «session_key» өрістері әрқашан 128 таңбадан тұрады. Мұнда CHAR пайдалану өңдеу қуатын үнемдейді.

3 -тің 2 әдісі: session.class.php файлын жасаңыз

2238751 4
2238751 4

Қадам 1. Класс құру

Жаңа сабақты бастау үшін төмендегі кодты енгізу қажет:

Жаңа сынып:

сынып сессиясы {

2238751 5
2238751 5

2 -қадам. _Construct функциясын жасаңыз

Бұл функция 'сеанс' класы арқылы объектінің жаңа данасын жасаған сайын шақырылады. PHP _construct функциясын мына жерден оқи аласыз.

Бұл функция біздің реттелетін сеанс өңдегішін орнатады, сондықтан ол сынып құрылғаннан кейін (яғни жасалған/салынған/салынған) пайдалануға болады.

_құрылыс функциясы:

_construct () {// біздің реттелетін сеанс функцияларын орнатыңыз. session_set_save_handler (массив ($ бұл, 'ашық'), массив ($ бұл, 'жабу'), массив ($ бұл, 'оқу'), массив ($ бұл, 'жазу'), массив ($ бұл, 'жою')), массив ($ this, 'gc')); // Бұл жол объектілерді сақтау өңдегіші ретінде пайдаланғанда күтпеген әсерлердің алдын алады. register_shutdown_function ('session_write_close'); }

2238751 6
2238751 6

Қадам 3. start_session функциясын жасаңыз

Бұл функция жаңа сеансты бастағыңыз келген сайын шақырылады, оны session_start (); орнына қолданыңыз. Әр жолдың не істейтінін білу үшін кодтағы түсініктемелерді қараңыз.

start_session функциясы:

start_session функциясы ($ session_name, $ secure) {// Сеанстың cookie файлына JavaScript арқылы қол жеткізілмейтініне көз жеткізіңіз. $ httponly = ақиқат; // Сеанс үшін қолданылатын хэш алгоритмі. (қолжетімді хэштер тізімін алу үшін hash_algos () пайдаланыңыз.) $ session_hash = 'sha512'; // Егер хэш бар -жоғын тексеріңіз, егер (in_array ($ session_hash, hash_algos ()))) // // Бар функциясын орнатыңыз. 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 айнымалы мәндерін емес, тек cookie файлдарын қолдануға мәжбүрлеңіз. 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_start (); // Бұл жол сеансты жаңартады және ескісін жояды. // Ол сонымен қатар дерекқорда жаңа шифрлау кілтін жасайды. session_regenerate_id (ақиқат); }

2238751 7
2238751 7

4 -қадам. Ашық функцияны жасаңыз

Бұл функцияны PHP сессиялары шақырады, егер біз жаңа сеансты бастасақ, біз оны жаңа дерекқор қосылымын бастау үшін қолданамыз.

ашық функция:

open function () {$ host = 'localhost'; $ user = 'sec_user'; $ pass = 'eKcGZr59zAa2BEWU'; $ name = 'қауіпсіз_сессиялар'; $ 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 ['бірдеңе];. Бір бетте бұл функцияға көптеген қоңыраулар болуы мүмкін болғандықтан, біз қауіпсіздік үшін ғана емес, сонымен қатар өнімділік үшін де дайындалған мәлімдемелерді қолданамыз. Біз мәлімдемені тек бір рет дайындаймыз, содан кейін оны бірнеше рет орындай аламыз.

Біз сондай -ақ дерекқорда шифрланған сеанс деректерінің шифрын шешеміз. Біз сеанстарда 256 биттік AES шифрлауды қолданамыз.

оқу функциясы:

оқу функциясы ($ id) {if (! isset ($ this-> read_stmt))) {$ this-> read_stmt = $ this-> db-> дайындау («SELECT FROM SECRO OF 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 ($ деректер); $ this-> read_stmt-> fetch (); $ key = $ this-> getkey ($ id); $ data = $ this-> шифрын ашу ($ data, $ key); $ деректерін қайтару; }

2238751 10
2238751 10

Қадам 7. Жазу функциясын жасаңыз

Бұл функция сеансқа мән берген кезде қолданылады, мысалы $ _SESSION ['бір нәрсе'] = 'басқа нәрсе';. Функция дерекқорға енгізілетін барлық деректерді шифрлайды.

жазу функциясы:

жазу функциясы ($ id, $ data) {// Бірегей кілтті алу $ key = $ this-> getkey ($ id); // Деректерді шифрлау $ data = $ this-> шифрлау ($ data, $ key); $ уақыт = уақыт (); if (! isset ($ this-> w_stmt)) {$ this-> w_stmt = $ this-> db-> дайындау («ОРЫНДАЛУ СЕЦИЯЛАРЫНА (id, set_time, data, session_key)) МӘНДЕР (?,?,?,?) »); } $ this-> w_stmt-> bind_param ('siss', $ id, $ time, $ data, $ key); $ this-> w_stmt-> execute (); шындықты қайтару; }

2238751 11
2238751 11

Қадам 8. жою функциясын жасаңыз

Бұл функция сеансты дерекқордан жояды, оны php пайдаланады, егер біз session_destroy (); сияқты функцияларды шақырсақ.

жою функциясы:

функцияны жою ($ id) {if (! isset ($ this-> delete_stmt))) {$ this-> delete_stmt = $ this-> db-> дайындау («DELETE FROM session WHERE id =?»); } $ this-> delete_stmt-> bind_param (s, $ id); $ this-> delete_stmt-> execute (); шындықты қайтару; }

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 WHERE сеанстарынан ЖОЮ <?»); } $ old = time () - $ max; $ this-> gc_stmt-> bind_param ('s, $ old); $ this-> gc_stmt-> execute (); шындықты қайтару; }

2238751 13
2238751 13

Қадам 10. getKey функциясын жасаңыз

Бұл функция сеанстар кестесінен шифрлаудың бірегей кілтін алу үшін қолданылады. Егер сеанс болмаса, ол шифрлау үшін жаңа кездейсоқ кілтті қайтарады.

getkey () функциясы:

жеке функция getkey ($ id) {if (! isset ($ this-> key_stmt)) {$ this-> key_stmt = $ this-> db-> дайындау («SELECT session_key FROM session WHERE id =? LIMIT 1»); } $ this-> key_stmt-> bind_param (s, $ id); $ this-> key_stmt-> execute (); $ this-> key_stmt-> store_result (); егер ($ this-> key_stmt-> num_rows == 1) {$ this-> key_stmt-> bind_result ($ key); $ this-> key_stmt-> fetch (); $ кілтін қайтару; } else {$ random_key = хэш ('sha512', бірегей (mt_rand (1, mt_getrandmax ()), шын))); $ random_key қайтару; }}

2238751 14
2238751 14

Қадам 11. Шифрлау және шифрын ашу функцияларын жасаңыз

Бұл функциялар сеанстардың деректерін шифрлайды, олар әр сеанс үшін әр түрлі дерекқордан шифрлау кілтін қолданады. Біз бұл кілтті шифрлауда тікелей қолданбаймыз, бірақ біз кілт хэшін кездейсоқ ету үшін қолданамыз.

encrypt () және decrypt () функциялары:

жеке функцияны шифрлау ($ 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 -ші әдіс 3: Сеанстармен беттер құру

2238751 16
2238751 16

Қадам 1. Арнайы сеанс менеджерімен сеанстарды пайдалану

Төменде сіз жаңа сеансты қалай бастайтыныңызды көресіз; Сіз мұны сеанстарға кіргіңіз келетін әр бетте қосуыңыз керек, оны session_start () орнына қолданыңыз;

Сеанстың басталуы:

талап ету ('session.class.php'); $ сеанс = жаңа сессия (); // Егер https $ session-> start_session ('_ s', false) қолданылса, true мәніне орнатыңыз; $ _SESSION ['something'] = 'Мән.'; echo $ _SESSION ['бірдеңе];

Ұсынылған: