Сессии и авторизация
TRANSCRIPT
![Page 1: Сессии и авторизация](https://reader036.vdocuments.net/reader036/viewer/2022081605/58f014d71a28ab9f548b460d/html5/thumbnails/1.jpg)
Сессии и авторизацияWeb
Артём Картасов
![Page 2: Сессии и авторизация](https://reader036.vdocuments.net/reader036/viewer/2022081605/58f014d71a28ab9f548b460d/html5/thumbnails/2.jpg)
Ключевые понятия
• Идентификация - это заявление о том, кем вы являетесь;
• Аутентификация - предоставление доказательств, что вы на самом деле есть тот, кем идентифицировались;
• Авторизация - проверка, что вам разрешен доступ к запрашиваемому ресурсу;
![Page 3: Сессии и авторизация](https://reader036.vdocuments.net/reader036/viewer/2022081605/58f014d71a28ab9f548b460d/html5/thumbnails/3.jpg)
Аутентификация по паролю:
• HTTP Basic authentication :• username и password передаются в незашифрованном виде;• относительно безопасен при https;
• HTTP Digest authentication:• используются хэшированные username, password + nonce;• уязвима к man-in-the-middle атакам;
• Forms authentication:• нет стандарта, реализации специфичны для конкретных систем
![Page 4: Сессии и авторизация](https://reader036.vdocuments.net/reader036/viewer/2022081605/58f014d71a28ab9f548b460d/html5/thumbnails/4.jpg)
Пример 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>";}
![Page 5: Сессии и авторизация](https://reader036.vdocuments.net/reader036/viewer/2022081605/58f014d71a28ab9f548b460d/html5/thumbnails/5.jpg)
Способы передачи username и password:
1. URL query — небезопасный вариант, т. к. строки URL могут запоминаться браузерами, в логах, прокси и веб-серверами.
2. Request body — безопасный вариант, но он применим только для запросов, содержащих тело сообщения (такие как POST, PUT, PATCH).
3. HTTP header —оптимальный вариант, при этом могут использоваться и стандартный заголовок Authorization (например, с Basic-схемой), и другие произвольные заголовки.
![Page 6: Сессии и авторизация](https://reader036.vdocuments.net/reader036/viewer/2022081605/58f014d71a28ab9f548b460d/html5/thumbnails/6.jpg)
Сессии• Хранятся на сервере;
• Доступ к данным через суперглобальный массив $_SESSION;
• По умолчанию сессии работают в файловой системе;
• Запускаются session_start(), либо автоматически(php.ini) session.auto_start = 1
• Сессия завершает свою работу в конце php-скрипта,
• может быть завершена и вручную session_write_close();• Идентификатор сессии (session id):
• хранится в cookies;• передается через URL (не рекомендуется);
![Page 7: Сессии и авторизация](https://reader036.vdocuments.net/reader036/viewer/2022081605/58f014d71a28ab9f548b460d/html5/thumbnails/7.jpg)
Сессии. Пример
Регистрация переменной в сессии:
<?phpsession_start();if (!isset($_SESSION['count'])) { $_SESSION['count'] = 0;} else { $_SESSION['count']++;}
Отмена объявления переменной:
<?phpsession_start();unset($_SESSION['count']);?>
![Page 8: Сессии и авторизация](https://reader036.vdocuments.net/reader036/viewer/2022081605/58f014d71a28ab9f548b460d/html5/thumbnails/8.jpg)
Cookies
• Хранятся на клиенте;• Cookies являются частью HTTP-заголовка;• Cookies, отправленные серверу браузером клиента, будут включены в
суперглобальный массив $_COOKIE;
![Page 9: Сессии и авторизация](https://reader036.vdocuments.net/reader036/viewer/2022081605/58f014d71a28ab9f548b460d/html5/thumbnails/9.jpg)
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);
![Page 10: Сессии и авторизация](https://reader036.vdocuments.net/reader036/viewer/2022081605/58f014d71a28ab9f548b460d/html5/thumbnails/10.jpg)
Безопасность. Сессии:
• Используйте только cookie. В php.ini:• session.use_cookies = 1• session.use_only_cookies = 1• session_cookie_httponly = 1
• Регенерируйте ID сессии при помощи session_regenerate_id(true) после логина или смены прав:
![Page 11: Сессии и авторизация](https://reader036.vdocuments.net/reader036/viewer/2022081605/58f014d71a28ab9f548b460d/html5/thumbnails/11.jpg)
Пароли. Пример
$hashed_password = crypt('mypassword'); // соль будет сгенерирована автоматически
if (hash_equals($hashed_password, crypt($user_input, $hashed_password))) { echo "Пароль верен!";}
![Page 12: Сессии и авторизация](https://reader036.vdocuments.net/reader036/viewer/2022081605/58f014d71a28ab9f548b460d/html5/thumbnails/12.jpg)
Пароли. Пример
<?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
![Page 13: Сессии и авторизация](https://reader036.vdocuments.net/reader036/viewer/2022081605/58f014d71a28ab9f548b460d/html5/thumbnails/13.jpg)
Безопасность. Пароли:• Запретите создавать простые пароли;• Защита от перебора паролей:
• ограничение попыток ввода (10 в минуту с одного IP достаточно); • CAPTCHA;
• Не храните пароль в явном виде - только хэш;• Используйте стойкие алгоритмы шифрования, например, bcrypt:
• bcrypt - не панацея, а лишь даёт вам время;• md5, sha1 и т.д. - не вариант, даже с солью;
![Page 14: Сессии и авторизация](https://reader036.vdocuments.net/reader036/viewer/2022081605/58f014d71a28ab9f548b460d/html5/thumbnails/14.jpg)
Альтернативные способы аутентификации
• Аутентификация по ключам доступа (access key, API key)• обязательно использовать защищенное соединение;
• Аутентификация по токенам:• “Активный” клиент (iOS/Android приложения)• “Пассивный” клиент (браузер. Пример: OAuth, OAuth2)