PHP жана MySQLде Коопсуз Сеанс Башкаруу Системасын түзүүнүн 3 жолу

Мазмуну:

PHP жана MySQLде Коопсуз Сеанс Башкаруу Системасын түзүүнүн 3 жолу
PHP жана MySQLде Коопсуз Сеанс Башкаруу Системасын түзүүнүн 3 жолу

Video: PHP жана MySQLде Коопсуз Сеанс Башкаруу Системасын түзүүнүн 3 жолу

Video: PHP жана MySQLде Коопсуз Сеанс Башкаруу Системасын түзүүнүн 3 жолу
Video: Нелогичная жизнь_Рассказ_Слушать 2024, Апрель
Anonim

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

Кадамдар

3төн 1 -ыкма: mySQL маалымат базасын конфигурациялоо

2238751 1
2238751 1

Кадам 1. MySQL маалымат базасын түзүү

Бул колдонмодо биз "secure_sessions" деп аталган маалымат базасын түзөбүз.

PhpMyAdmin-де-базасын кантип түзүүнү караңыз.

Же төмөндөгү SQL кодун колдонсоңуз болот, ал сиз үчүн бирөөнү түзөт.

Маалыматтар базасынын кодун түзүү:

DATABASE CREATE `secure_sessions`;

Эскертүү: Кээ бир хостинг кызматтары phpMyAdmin аркылуу маалымат базасын түзүүгө мүмкүндүк бербейт, cPanelде муну кантип жасоону үйрөнүңүз.

2238751 2
2238751 2

Кадам 2. SELECT, INSERT жана DELETE артыкчылыктары менен гана колдонуучу түзүңүз

Демек, эгерде биздин скриптте коопсуздук бузулган болсо, анда хакер биздин базадан таблицаларды түшүрө албайт. Эгер чындап параноид болсоңуз, ар бир функция үчүн башка колдонуучу түзүңүз.

  • Колдонуучу:

    "sec_user"

  • Купуя сөз:

    "eKcGZr59zAa2BEWU"

Колдонуучу кодун түзүү:

CREATE USER 'sec_user'@'localhost' IDENTIFIED 'eKcGZr59zAa2BEWU'; ГРАНТ ТАНДОО, КИРГИЗҮҮ, ЖАҢЫРТУУ, ӨЧҮРҮҮ `safe_sessions`.* TO 'sec_user'@'localhost';

Эскертүү: Өз сервериңизде иштеп жатканда жогорудагы коддогу паролду өзгөртүү жакшы. (PHP кодуңузду дагы өзгөрткөнүңүздү текшериңиз.) Эсиңизде болсун, сырсөздүн кереги жок, мүмкүн болушунча татаалыраак. Бул жерде кокус сырсөз генератору бар.

2238751 3
2238751 3

Кадам 3. "сессиялар" аттуу MySQL таблицасын түзүңүз

Төмөндөгү код 4 талаадан турган таблицаны түзөт (id, set_time, data, session_key).

"Сеанстар" таблицасын түзүңүз:

CREAT TABLE `сеанстары` (` id` char (128) NOT NULL, `set_time` char (10) NOT NULL,` data` text NOT NULL, `session_key` char (128) NOT NULL, PRIMARY KEY (` id`)) ENGINE = InnoDB DEFAULT CHARSET = 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 функциясын бул жерден окуй аласыз.

Бул функция биздин ыңгайлаштырылган сессия иштетүүчүбүздү орнотот, андыктан ал класстын дароо колдонулушу үчүн жеткиликтүү болот (б.а. жасалган/курулган/курулган).

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

function _construct () {// биздин ыңгайлаштырылган сессия функцияларыбызды коюңуз. session_set_save_handler (массив ($ this, 'open'), array ($ this, 'close'), array ($ this, 'read'), array ($ this, 'write'), array ($ this, 'destroy'), массив ($ this, 'gc')); // Бул линия объекттерди сактоочу катары колдонууда күтүлбөгөн эффекттердин алдын алат. register_shutdown_function ('session_write_close'); }

2238751 6
2238751 6

Кадам 3. start_session функциясын түзүү

Бул функция жаңы сессияны баштагыңыз келген сайын чакырылат, аны session_start (); ордуна колдонуңуз. Ар бир саптын эмне кылганын көрүү үчүн коддогу комментарийлерди караңыз.

start_session функциясы:

start_session function ($ session_name, $ secure) {// Сеанстын куки JavaScript аркылуу жеткиликтүү эместигин текшериңиз. $ httponly = true; // Сеанс үчүн колдонуу үчүн хэш алгоритми. (жеткиликтүү хэштердин тизмесин алуу үчүн 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 өзгөрмөлөрүн эмес, кукилерди гана колдонууга мажбур кылыңыз. 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 сессиялары тарабынан жаңы сессия башталганда чакырылат, биз аны жаңы маалымат базасына туташууну баштоо үчүн колдонобуз.

ачык функция:

open function () {$ host = 'localhost'; $ user = 'sec_user'; $ pass = 'eKcGZr59zAa2BEWU'; $ name = 'secure_sessions'; $ mysqli = жаңы mysqli ($ host, $ user, $ pass, $ name); $ this-> db = $ mysqli; чындыкка кайтуу; }

2238751 8
2238751 8

Кадам 5. Жабуу функциясын түзүү

Бул функция сессиялар жабылгысы келгенде чакырылат.

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

function close () {$ this-> db-> close (); чындыкка кайтуу; }

2238751 9
2238751 9

Кадам 6. Окуу функциясын түзүү

Бул функция, мисалы, echo $ _SESSION ['бир нерсе'] колдонгондо, биз сессияга кирүүгө аракет кылганда PHP тарабынан чакырылат. Бир баракта бул функцияга көптөгөн чалуулар болушу мүмкүн болгондуктан, биз коопсуздук үчүн гана эмес, аткаруу үчүн да даярдалган билдирүүлөрдүн артыкчылыктарын колдонобуз. Биз арызды бир гана жолу даярдайбыз, андан кийин аны көп жолу аткара алабыз.

Биз ошондой эле маалымат базасында шифрленген сессиянын маалыматын чечмелейбиз. Биз сессияларыбызда 256-бит AES шифрлөөнү колдонобуз.

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

окуу функциясы ($ id) {if (! isset ($ this-> read_stmt))) {$ this-> read_stmt = $ this-> db-> дайындау ("SELECT FROM FROM 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-> get (); $ key = $ this-> getkey ($ id); $ data = $ this-> шифрди чечүү ($ data, $ key); $ маалыматтарды кайтаруу; }

2238751 10
2238751 10

Кадам 7. Жазуу функциясын түзүү

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

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

write function ($ id, $ data) {// уникалдуу ачкычты алуу $ key = $ this-> getkey ($ id); // Маалыматтарды шифрлөө $ data = $ this-> шифрлөө ($ data, $ key); $ time = time (); 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 SERS WHERE id =?"); } $ this-> delete_stmt-> bind_param ('s, $ id); $ this-> delete_stmt-> execute (); чындыкка кайтуу; }

2238751 12
2238751 12

Step 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 '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 (); if ($ 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. Шифрлөө жана чечмелөө функцияларын түзүү

Бул функциялар сессиялардын маалыматтарын шифрлейт, алар ар бир сессия үчүн башкача болгон маалымат базасынан шифрлөө ачкычын колдонушат. Биз бул ачкычты шифрлөөдө түз колдонбойбуз, бирок аны ачкычты дагы туш келди кылуу үчүн колдонобуз.

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

жеке функцияны шифрлөө ($ data, $ key) {$ salt = 'cH! swe! retReGu7W6bEDRup7usuDUh9THeD2CHeGE*ewr4n39 = E@rAsp7c-Ph@pH'; $ key = substr (hash ('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 (hash ('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); $ decrypted = rtrim ($ decrypted, "\ 0"); $ кайтып келүү; }

2238751 15
2238751 15

Кадам 12. Класс бүтүрүү

Бул жерде биз жөн гана класстардын бүктөмөлүү кашаанын аягына чыгабыз:

Аяктоо классы:

}

3 методу 3: сессиялар менен барактарды түзүү

2238751 16
2238751 16

Кадам 1. Көнүмүш сессия менеджери менен сессияларды колдонуу

Төмөндө сиз жаңы сессияны кантип баштайсыз; Сиз муну сессияларга киргиңиз келген ар бир баракка кошушуңуз керек, аны session_start () ордуна колдонуңуз;

Сеансты баштоо:

талап кылуу ('session.class.php'); $ session = new session (); // https $ session-> start_session ('_ s', false) колдонулса, true деп коюңуз; $ _SESSION ['something'] = 'Мааниси'; echo $ _SESSION ['бир нерсе'];

Сунушталууда: