Сессии и авторизация Web Артём Картасов
Сессии и авторизацияWeb
Артём Картасов
Ключевые понятия
• Идентификация - это заявление о том, кем вы являетесь;
• Аутентификация - предоставление доказательств, что вы на самом деле есть тот, кем идентифицировались;
• Авторизация - проверка, что вам разрешен доступ к запрашиваемому ресурсу;
Аутентификация по паролю:
• HTTP Basic authentication :• username и password передаются в незашифрованном виде;• относительно безопасен при https;
• HTTP Digest authentication:• используются хэшированные username, password + nonce;• уязвима к man-in-the-middle атакам;
• Forms authentication:• нет стандарта, реализации специфичны для конкретных систем
Пример Basic HTTP-аутентификации
<?phpif (!isset($_SERVER['PHP_AUTH_USER'])) { header('WWW-Authenticate: Basic realm="My Realm"'); header('HTTP/1.0 401 Unauthorized'); echo 'Текст, отправляемый в том случае, если пользователь нажал Cancel'; exit;} else { echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>"; echo "<p>Вы ввели пароль {$_SERVER['PHP_AUTH_PW']}.</p>";}
Способы передачи username и password:
1. URL query — небезопасный вариант, т. к. строки URL могут запоминаться браузерами, в логах, прокси и веб-серверами.
2. Request body — безопасный вариант, но он применим только для запросов, содержащих тело сообщения (такие как POST, PUT, PATCH).
3. HTTP header —оптимальный вариант, при этом могут использоваться и стандартный заголовок Authorization (например, с Basic-схемой), и другие произвольные заголовки.
Сессии• Хранятся на сервере;
• Доступ к данным через суперглобальный массив $_SESSION;
• По умолчанию сессии работают в файловой системе;
• Запускаются session_start(), либо автоматически(php.ini) session.auto_start = 1
• Сессия завершает свою работу в конце php-скрипта,
• может быть завершена и вручную session_write_close();• Идентификатор сессии (session id):
• хранится в cookies;• передается через URL (не рекомендуется);
Сессии. Пример
Регистрация переменной в сессии:
<?phpsession_start();if (!isset($_SESSION['count'])) { $_SESSION['count'] = 0;} else { $_SESSION['count']++;}
Отмена объявления переменной:
<?phpsession_start();unset($_SESSION['count']);?>
Cookies
• Хранятся на клиенте;• Cookies являются частью HTTP-заголовка;• Cookies, отправленные серверу браузером клиента, будут включены в
суперглобальный массив $_COOKIE;
Cookies. ПримерыУстановка cookies:
<?php$value = 'test';
setcookie("TestCookie", $value);/* срок действия 1 час */setcookie("TestCookie", $value, time()+3600);
Чтение cookies:
<?phpecho $_COOKIE["TestCookie"];// все cookiesprint_r($_COOKIE);
Удаление cookies:
<?php// установка даты истечения срока действия на час назадsetcookie ("TestCookie", "", time() - 3600);
Безопасность. Сессии:
• Используйте только cookie. В php.ini:• session.use_cookies = 1• session.use_only_cookies = 1• session_cookie_httponly = 1
• Регенерируйте ID сессии при помощи session_regenerate_id(true) после логина или смены прав:
Пароли. Пример
$hashed_password = crypt('mypassword'); // соль будет сгенерирована автоматически
if (hash_equals($hashed_password, crypt($user_input, $hashed_password))) { echo "Пароль верен!";}
Пароли. Пример
<?php$hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq';if (password_verify('rasmuslerdorf', $hash)) { echo 'Password is valid!';} else { echo 'Invalid password.';}
<?phppassword_hash("rasmuslerdorf", PASSWORD_DEFAULT); // $2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq
Безопасность. Пароли:• Запретите создавать простые пароли;• Защита от перебора паролей:
• ограничение попыток ввода (10 в минуту с одного IP достаточно); • CAPTCHA;
• Не храните пароль в явном виде - только хэш;• Используйте стойкие алгоритмы шифрования, например, bcrypt:
• bcrypt - не панацея, а лишь даёт вам время;• md5, sha1 и т.д. - не вариант, даже с солью;
Альтернативные способы аутентификации
• Аутентификация по ключам доступа (access key, API key)• обязательно использовать защищенное соединение;
• Аутентификация по токенам:• “Активный” клиент (iOS/Android приложения)• “Пассивный” клиент (браузер. Пример: OAuth, OAuth2)