3 начина за създаване на сигурна система за управление на сесии в PHP и MySQL

Съдържание:

3 начина за създаване на сигурна система за управление на сесии в PHP и MySQL
3 начина за създаване на сигурна система за управление на сесии в PHP и MySQL

Видео: 3 начина за създаване на сигурна система за управление на сесии в PHP и MySQL

Видео: 3 начина за създаване на сигурна система за управление на сесии в PHP и MySQL
Видео: ВЕБ-ДИЗАЙН в 16 | Заработок от 100к в месяц | КАК НАЧАТЬ? | Где искать клиентов? Вопросы про дизайн 2024, Март
Anonim

Това ръководство ще ви покаже как можете да съхранявате вашите сесии сигурно в база данни mySQL. Също така ще шифроваме всички данни за сесията, които влизат в базата данни, което означава, че ако някой успее да проникне в базата данни, всички данни за сесията са криптирани чрез 256-битово AES криптиране.

Стъпки

Метод 1 от 3: Конфигуриране на MySQL база данни

2238751 1
2238751 1

Стъпка 1. Създайте база данни MySQL

В това ръководство ще създадем база данни, наречена "secure_sessions".

Вижте как да създадете база данни в phpMyAdmin.

Или можете да използвате SQL кода по -долу, ще създадете такъв за вас.

Създайте код на база данни:

CREATE DATABASE `secure_sessions`;

Забележка: Някои хостинг услуги не ви позволяват да създавате база данни чрез phpMyAdmin, Научете как да го направите в cPanel.

2238751 2
2238751 2

Стъпка 2. Създайте потребител само с права SELECT, INSERT и DELETE

Това означава, че ако някога е имало нарушение на сигурността в нашия скрипт, хакерът не може да изпусне таблици от нашата база данни. Ако наистина сте параноик, създайте различен потребител за всяка функция.

  • Потребител:

    "sec_user"

  • Парола:

    "eKcGZr59zAa2BEWU"

Създайте потребителски код:

CREATE USER 'sec_user'@'localhost' ИДЕНТИФИЦИРАНО ОТ 'eKcGZr59zAa2BEWU'; ГРАНТИРАЙТЕ ИЗБРАНЕ, ВМЕСТВАНЕ, АКТУАЛИЗИРАНЕ, ИЗТРИВАНЕ НА `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) NOT NULL,` data` text NOT NULL, `session_key` char (128) NOT NULL, PRIMARY KEY (` id`)) ДВИГАТЕЛ = InnoDB ШАБЛОН по подразбиране = 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 функция:

function _construct () {// задаваме нашите персонализирани функции на сесията. session_set_save_handler (масив ($ this, 'open'), масив ($ this, 'close'), масив ($ this, 'read'), масив ($ this, 'write'), масив ($ this, 'унищожи')), масив ($ this, 'gc')); // Този ред предотвратява неочаквани ефекти при използване на обекти като манипулатори за запазване. register_shutdown_function ('session_write_close'); }

2238751 6
2238751 6

Стъпка 3. Създайте функция start_session

Тази функция ще се извиква всеки път, когато искате да започнете нова сесия, използвайте я вместо session_start ();. Вижте коментарите в кода, за да видите какво прави всеки ред.

функция start_session:

функция start_session ($ session_name, $ secure) {// Уверете се, че бисквитката на сесията не е достъпна чрез javascript. $ 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 (true); }

2238751 7
2238751 7

Стъпка 4. Създайте отворена функция

Тази функция ще бъде извикана от PHP сесиите, когато стартираме нова сесия, използваме я за стартиране на нова връзка с база данни.

отворена функция:

функция open () {$ host = 'localhost'; $ user = 'sec_user'; $ pass = 'eKcGZr59zAa2BEWU'; $ name = 'secure_sessions'; $ mysqli = нов mysqli ($ хост, $ потребител, $ пас, $ име); $ this-> db = $ mysqli; връщане true; }

2238751 8
2238751 8

Стъпка 5. Създайте функция за затваряне

Тази функция ще бъде извикана, когато сесиите искат да бъдат затворени.

функция за затваряне:

функция close () {$ this-> db-> close (); връщане true; }

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 ($ данни); $ this-> read_stmt-> fetch (); $ key = $ this-> getkey ($ id); $ данни = $ това-> декриптиране ($ данни, $ ключ); връщане на $ данни; }

2238751 10
2238751 10

Стъпка 7. Създайте функция за запис

Тази функция се използва, когато присвояваме стойност на сесия, например $ _SESSION ['something'] = 'нещо друго';. Функцията криптира всички данни, които се вмъкват в базата данни.

функция за запис:

function write ($ id, $ data) {// Вземете уникален ключ $ key = $ this-> getkey ($ id); // Шифроване на данните $ data = $ this-> криптиране ($ данни, $ ключ); $ време = време (); if (! isset ($ this-> w_stmt)) {$ this-> w_stmt = $ this-> db-> подготви („ЗАМЕНИ ВЪВ сесиите (id, set_time, data, session_key) VALUES (?,?,?,?) "); } $ this-> w_stmt-> bind_param ('siss', $ id, $ time, $ data, $ key); $ this-> w_stmt-> execute (); връщане true; }

2238751 11
2238751 11

Стъпка 8. Създайте функция унищожаване

Тази функция изтрива сесията от базата данни, тя се използва от php, когато извикваме функции като session_destroy ();.

унищожи функция:

функция унищожи ($ id) {if (! isset ($ this-> delete_stmt)) {$ this-> delete_stmt = $ this-> db-> подготви ("ИЗТРИВАНЕ ОТ сесии КЪДЕ id =?"); } $ this-> delete_stmt-> bind_param ('s', $ id); $ this-> delete_stmt-> execute (); връщане true; }

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-> execute (); връщане true; }

2238751 13
2238751 13

Стъпка 10. Създайте функция getKey

Тази функция се използва за получаване на уникалния ключ за криптиране от таблицата на сесиите. Ако няма сесия, тя просто връща нов произволен ключ за криптиране.

getkey () Функция:

частна функция getkey ($ id) {if (! isset ($ this-> key_stmt)) {$ this-> key_stmt = $ this-> db-> pripremite ("SELECT session_key FROM сесии 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. Създайте функции за криптиране и декриптиране

Тези функции криптират данните за сесиите, те използват ключ за криптиране от базата данни, който е различен за всяка сесия. Ние не използваме директно този ключ в криптирането, но го използваме, за да направим хеша на ключа още по -случаен.

функции за криптиране () и декриптиране ():

криптиране на частна функция ($ данни, $ ключ) {$ 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); $ криптиран = base64_encode (mcrypt_encrypt (MCRYPT_RIJNDAEL_256, $ ключ, $ данни, MCRYPT_MODE_ECB, $ iv)); връщане $ криптиран; } декриптиране на частна функция ($ данни, $ ключ) {$ 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, $ ключ, base64_decode ($ данни), MCRYPT_MODE_ECB, $ iv); $ decrypted = rtrim ($ decrypted, "\ 0"); върнете $ декриптиран; }

2238751 15
2238751 15

Стъпка 12. Краен клас

Тук просто завършваме курсовите скоби на класовете:

Краен клас:

}

Метод 3 от 3: Създаване на страници със сесии

2238751 16
2238751 16

Стъпка 1. Използване на сесии с персонализиран мениджър на сесии

По -долу е описано как бихте започнали нова сесия; ще трябва да включите това на всяка страница, на която искате да получите достъп до сесиите, използвайте го вместо session_start ();

Започване на сесия:

require ('session.class.php'); $ сесия = нова сесия (); // Задайте на true, ако използвате https $ session-> start_session ('_ s', false); $ _SESSION ['something'] = 'Стойност.'; echo $ _SESSION ['нещо'];

Препоръчано: