60 lines
5.2 KiB
Markdown
60 lines
5.2 KiB
Markdown
|
---
|
|||
|
title: Session Identifier Acquirement
|
|||
|
localeTitle: Приобретение идентификатора сеанса
|
|||
|
---
|
|||
|
## Приобретение идентификатора сеанса
|
|||
|
|
|||
|
Идентификатор сеанса Приобретение - это уязвимость, вызванная тем, что злоумышленник может либо угадать идентификатор сеанса пользователя, либо использовать уязвимости в самом приложении или в браузере пользователя для получения идентификатора сеанса. Эта атака является предварительным условием для выполнения атаки на захват сеанса.
|
|||
|
|
|||
|
### пример
|
|||
|
|
|||
|
У злоумышленника есть несколько вариантов выполнения атаки на получение идентификатора сеанса.
|
|||
|
|
|||
|
* Угадайте идентификатор: короткий и допустимый идентификатор сеанса может позволить злоумышленнику перевести идентификатор сеанса и войти в него.
|
|||
|
* Атака на браузер: если вы храните идентификатор сеанса в кукисах браузера - если ваш сайт уязвим для межсайтового скриптинга, злоумышленник может использовать эту уязвимость для сбора куки-файлов с идентификаторами сеансов и доступа к областям с высоким уровнем привилегий (например, панель администратора) ,
|
|||
|
* Изменение идентификатора на выбор злоумышленника: в более старых версиях PHP вы могли установить идентификатор сеанса в URL-адресе. Теперь он отключен по умолчанию, если у вас есть сомнения, убедитесь, что `session.use_trans_sid` является ложным. Это уже не обычная проблема, но все равно это может произойти, лучше, чем жаль.
|
|||
|
|
|||
|
### Защита от атак Session Identifier в PHP
|
|||
|
|
|||
|
Для защиты от атак типа «Идентификатор сеанса» вам необходимо проверить попытку доступа к сеансу с несколькими факторами, чтобы убедиться, что это законный доступ и чтобы пользователь не смог успешно захватить сеанс пользователя. Ниже приведен пример реализации, который может помочь смягчить последствия атаки на получение идентификатора сеанса. Он проверяет IP-адрес, Пользовательский агент, и если сеанс Истек, удаление сеанса перед его приобретением.
|
|||
|
|
|||
|
```PHP
|
|||
|
<?php
|
|||
|
session_start();
|
|||
|
|
|||
|
// Does IP Address match?
|
|||
|
if ($_SERVER['REMOTE_ADDR'] != $_SESSION['ipaddress'])
|
|||
|
{
|
|||
|
session_unset();
|
|||
|
session_destroy();
|
|||
|
}
|
|||
|
|
|||
|
// Does user agent match?
|
|||
|
if ($_SERVER['HTTP_USER_AGENT'] != $_SESSION['useragent'])
|
|||
|
{
|
|||
|
session_unset();
|
|||
|
session_destroy();
|
|||
|
}
|
|||
|
|
|||
|
// Is the last access over an hour ago?
|
|||
|
if (time() > ($_SESSION['lastaccess'] + 3600))
|
|||
|
{
|
|||
|
session_unset();
|
|||
|
session_destroy();
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
$_SESSION['lastaccess'] = time();
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
**Подсказки:**
|
|||
|
|
|||
|
* Храните много информации о текущем сеансе (строка агента пользователя, IP-адрес, время последнего доступа и т. Д.).
|
|||
|
* Проверяйте каждый запрос в отношении информации, хранящейся в сеансе (соответствует ли она? Если не удалять сеанс и требуется повторная регистрация пользователя)
|
|||
|
* Сеансы не должны длиться вечно - они должны истечь в определенный момент, чтобы поддерживать безопасность сеанса.
|
|||
|
* Скорость ограничивает количество сеансов, к которым пользователь может попытаться получить доступ (пользователь попытался получить доступ к 1000 + недействительным сеансам? Скорее всего, они угадывают - не позволяйте IP-адресу пытаться больше сеансов в течение нескольких часов).
|
|||
|
|
|||
|
#### Дополнительная информация:
|
|||
|
|
|||
|
* [Руководство по безопасности сессии php.net](https://secure.php.net/manual/en/session.security.php)
|