3 способа создания безопасной системы управления сеансом в PHP и MySQL

Оглавление:

3 способа создания безопасной системы управления сеансом в PHP и MySQL
3 способа создания безопасной системы управления сеансом в PHP и MySQL

Видео: 3 способа создания безопасной системы управления сеансом в PHP и MySQL

Видео: 3 способа создания безопасной системы управления сеансом в PHP и MySQL
Видео: Как люди представляют программиста, и как он выглядит на самом деле! 2024, Апрель
Anonim

Это руководство покажет вам, как безопасно хранить свои сеансы в базе данных mySQL. Мы также зашифруем все данные сеанса, которые поступают в базу данных, что означает, что если кому-то удастся взломать базу данных, все данные сеанса будут зашифрованы 256-битным шифрованием AES.

Шаги

Метод 1 из 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-код.) Помните, что это не обязательно должен быть пароль, который вы можете запомнить, поэтому make будет настолько сложным, насколько это возможно. Вот генератор случайных паролей.

2238751 3
2238751 3

Шаг 3. Создайте таблицу MySQL с именем «sessions»

Приведенный ниже код создает таблицу с 4 полями (id, set_time, data, session_key).

Создайте таблицу "сеансов":

CREATE TABLE `sessions` (` id` char (128) NOT NULL, `set_time` char (10) NOT NULL,` data` text NOT NULL, `session_key` char (128) NOT NULL, PRIMARY KEY (` id`)) ДВИГАТЕЛЬ = ИННОДБ ДАННЫЕ ПО УМОЛЧАНИЮ = latin1;

Мы используем тип данных CHAR для полей, длина которых нам известна, так как поля «id» и «session_key» всегда будут иметь длину 128 символов. Использование здесь CHAR позволяет сэкономить на вычислительной мощности.

Метод 2 из 3: создать файл session.class.php

2238751 4
2238751 4

Шаг 1. Создайте класс

Чтобы начать новый класс, вам нужно будет ввести код ниже:

Новый класс:

class session {

2238751 5
2238751 5

Шаг 2. Создайте функцию _construct

Эта функция будет вызываться каждый раз, когда мы создаем новый экземпляр объекта с использованием класса «сеанс». Вы можете прочитать о функции PHP _construct здесь.

Эта функция устанавливает наш собственный обработчик сеанса так, чтобы он был доступен для использования, как только класс будет создан (т. Е. Создан / построен / сконструирован).

_construct функция:

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

2238751 6
2238751 6

Шаг 3. Создайте функцию start_session

Эта функция будет вызываться каждый раз, когда вы захотите начать новый сеанс, используйте ее вместо session_start ();. См. Комментарии в коде, чтобы узнать, что делает каждая строка.

функция start_session:

function start_session ($ session_name, $ secure) {// Убедитесь, что файл cookie сеанса недоступен через javascript. $ httponly = true; // Алгоритм хеширования для использования в сеансе. (используйте hash_algos (), чтобы получить список доступных хэшей.) $ session_hash = 'sha512'; // Проверяем, доступен ли хэш if (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); // Заставить сеанс использовать только файлы cookie, а не переменные URL. ini_set ('session.use_only_cookies', 1); // Получить параметры cookie сеанса $ cookieParams = session_get_cookie_params (); // Устанавливаем параметры session_set_cookie_params ($ cookieParams ["время жизни"], $ cookieParams ["путь"], $ cookieParams ["домен"], $ secure, $ httponly); // Изменение имени сеанса session_name ($ session_name); // Теперь мы запускаем сеанс session_start (); // Эта строка восстанавливает сеанс и удаляет старую. // Он также генерирует новый ключ шифрования в базе данных. session_regenerate_id (истина); }

2238751 7
2238751 7

Шаг 4. Создайте открытую функцию

Эта функция будет вызываться сеансами PHP, когда мы запускаем новый сеанс, мы используем ее для запуска нового соединения с базой данных.

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

функция open () {$ host = 'localhost'; $ user = 'sec_user'; $ pass = '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-> prepare ("ВЫБРАТЬ данные ИЗ сеансов 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 ['something'] = 'something else';. Функция шифрует все данные, которые вставляются в базу данных.

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

function write ($ id, $ data) {// Получить уникальный ключ $ key = $ this-> getkey ($ id); // Шифрование данных $ data = $ this-> encrypt ($ data, $ key); $ время = время (); if (! isset ($ this-> w_stmt)) {$ this-> w_stmt = $ this-> db-> prepare ("ЗАМЕНИТЬ сеансы (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 ();.

функция уничтожения:

function destroy ($ id) {if (! isset ($ this-> delete_stmt)) {$ this-> delete_stmt = $ this-> db-> prepare ("УДАЛИТЬ ИЗ сессий 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 ():

function gc ($ max) {if (! isset ($ this-> gc_stmt)) {$ this-> gc_stmt = $ this-> db-> prepare ("УДАЛИТЬ ИЗ сеансов, ГДЕ set_time <?"); } $ 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-> prepare ("ВЫБРАТЬ ключ_сессии ИЗ сеансов 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 (); return $ key; } еще {$ random_key = hash ('sha512', uniqid (mt_rand (1, mt_getrandmax ()), true)); вернуть $ random_key; }}

2238751 14
2238751 14

Шаг 11. Создайте функции шифрования и дешифрования

Эти функции шифруют данные сеансов, они используют ключ шифрования из базы данных, который различается для каждого сеанса. Мы не используем этот ключ напрямую при шифровании, но мы используем его, чтобы сделать хэш ключа еще более случайным.

Функции encrypt () и decrypt ():

закрытая функция encrypt ($ 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 = новый сеанс (); // Установите значение true при использовании https $ session-> start_session ('_ s', false); $ _SESSION ['что-то'] = 'Значение.'; echo $ _SESSION ['что-то'];

Рекомендуемые: