Когда и почему я должен использовать сессии регенерировать идентификатор()?


почему и когда я должен использовать session_regenerate_id() функция в php? Я должен всегда использовать его после того, как я использую session_start()? Я читал, что я должен использовать его, чтобы предотвратить фиксацию сеанса, это единственная причина?

7 74

7 ответов:

что это session_regenerate_id()?

как говорит имя функции, это функция, которая заменит текущий идентификатор сеанса новым и сохранит информацию о текущем сеансе.

что он делает?

это в основном помогает предотвратить атаки фиксации сессии. Атаки фиксации сеанса-это когда злоумышленник пытается использовать уязвимость в системе для фиксации (установки) идентификатора сеанса (SID) другого пользователя. Поступая таким образом, они получат полный доступ как оригинальный пользователь и сможет выполнять задачи, которые в противном случае потребовали бы аутентификации.

чтобы предотвратить такие атаки, назначьте пользователю новый идентификатор сеанса с помощью session_regenerate_id() когда он успешно входит в систему (или для каждого X запросов). Теперь только у него есть идентификатор сеанса, и ваш старый (фиксированный) идентификатор сеанса больше не действителен.

когда я должен использовать session_regenerate_id()?

как указывает symbecean в комментариях ниже, идентификатор сеанса должен быть изменен при любом переходе в состояние аутентификации и только при переходе аутентификации.

читайте далее:

вы должны использовать session_regenerate_id() чтобы остановить сеанса и фиксация сессии.

С это Security.SE ответ:

сеанса относится к краже cookie сеанса. Это может быть наиболее легко достигнуто при совместном использовании в локальной сети с другими компьютерами. Например, в Starbucks. Образец... пользователь с сеансом Y просматривает веб-сайт Джеймса в Starbucks. Я слушаю их сетевой трафик, попивая свой латте. Я беру пользователя с куки-файлами сессии Y для веб-сайта Джеймса и устанавливаю свой браузер для их использования. Теперь, когда я получаю доступ к сайту Джеймса, сайт Джеймса.

С этот сайт:

фиксация сеанса-это метод атаки, который приводит идентификатор сеанса пользователя к явному значению. В зависимости от функциональности целевого веб-сайта для "исправления" значения идентификатора сеанса может быть использован ряд методов. Эти методы варьируются от Использование межсайтовых сценариев для пересыпания веб-сайта ранее выполненными HTTP-запросами. После того, как идентификатор сеанса пользователя был исправлен, злоумышленник будет ждать, пока этот пользователь войдет в систему. Как только пользователь делает это, злоумышленник использует предопределенное значение идентификатора сеанса, чтобы принять то же самое сетевое удостоверение.

При Использовании

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

Читайте также:

руководство по безопасности PHP: сессии

фиксация сессии(приятно читать)

Я думаю, что вопрос отравления сессии был покрыт довольно хорошо.

в ответ на вопрос "когда я должен использовать это?"часть, важно сделать шаг назад и рассмотреть, что ваше приложение делает с сессией. Или, другими словами, это ключевой вопрос безопасности, на который вам нужно ответить

Если бы кто-то получил эту сессию, что бы они получили?

Если все, что вы делаете, это отслеживать в противном случае анонимные данные (пользователь приходит на сайт и вы используете его для отслеживания своих посещений), то есть мало причин для восстановления сеанса. Угонщик не получил бы ничего ценного, захватив эту сессию.

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

каждый раз, когда мы добавляем критические данные в сеанс, вы должны рассмотреть возможность восстановления идентификатора сеанса. Если вам нужно затвердеть ваше приложение против фиксации, то случайная регенерация может быть полезна, но я никогда не буду регенерировать по каждому запросу. По умолчанию PHP хранит сессии в файлах на локальном диске. Вы добавляете много дискового ввода-вывода, чтобы смягчить то, что является относительно небольшим вектором атаки. Если вам действительно нужно больше безопасности я бы рекомендовал перейти на полный HTTPS над регенерацией на регулярной основе (HTTPS делает фиксацию очень трудной для снятия).

почему я должен использовать session_regenerate_id?

вы должны использовать его, чтобы предотвратить фиксация сессии.

когда я должен использовать session_regenerate_id?

всякий раз, когда состояние аутентификации изменяется, это в основном при входе и выходе из системы.

пример

Боб сидит за общим компьютером и просматривает stackoverflow.com он открывает там новую сессию. Идентификатор сеанса сохраняется в файле cookie (с httpOnly флаг для предотвращения доступа через javascript). Давайте представьте, что переполнение стека всегда включало HTTPS, а также secure флаг установлен для файла cookie.

как мы можем украсть сеанс сейчас?

Боб записывает идентификатор сеанса. Он выходит из компьютера, не закрывая браузер. Теперь Алиса приходит к этому компьютеру и видит, что переполнение стека уже загружено. Сейчас она входит в систему.

теперь мы находимся на стадии, когда вы должны использовать session_regenerate_id. Если вы не создадите новый идентификатор сеанса здесь во время входа в систему, Боб может использовать предыдущий сеанс он записал, чтобы получить доступ к сеансу Алисы и теперь будет зарегистрирован как Алиса.

простой пример использования:

// User visits a webshop
$shopcart = new Cart();

запускается сеанс и делается запись в базе данных. Магазинная тележка пользователя идентифицируется по его идентификатору сеанса.

// User orders items
$shopcart->add('123', 20);
$shopcart->add('124', 18);
$shopcart->add('127', 5);

для каждого добавленного продукта, запись производится в моей таблице shopcart. Также определяется идентификатором сеанса.

// User saves cart in order to use it later
$shopcart->save();

пользователь решил сохранить свою корзину. Теперь он прикрепляется к его идентификатору пользователя.

// Regenerate session id for user to be able to make a new cart
session_regenerate_id();

идентификатор сессии регенерируется, и теперь пользователь может начать создание еще одна корзина.

вы можете использовать его для лучшей безопасности.

таким образом, вы создаете идентификатор сеанса для одноразового использования.

допустим, ваш идентификатор сеанса пользователя = 3

какой-то хакер взломал ваш клиент и получил свой session_id. Таким образом, хакер может использовать этот файл cookie для использования своей сессии.

Если у вас есть код типа

session_start();
session_regenerate_id();

вы можете изменить их сессий каждый раз, когда они используют ваш сайт.

теперь хакер получает sessionid = 3

но вы изменили сеанс после того, как он использует это так ваш

пользователь имеет sessionid=4 / / auth

hacker have session=3 / / null

но есть небольшая точка позволяет сказать, что вы используете метод регенерации и ваш клиент просто войти на сайт и закрыть браузер или неактивен. У вашего клиента есть sessionid=4, и если хакер получает куки в этой части, у них будет тот же sessionid.

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

но это будет намного безопаснее, если вы используете SSL enc.

извините за плохой английский.

session_regenerate_id (): не удается восстановить идентификатор сеанса - сеанс не работает активный

if(session_status() == PHP_SESSION_ACTIVE)
{
    session_regenerate_id();
}