Когда и почему мне следует использовать session_regenerate_id ()?


95

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


потому что после начала сеанса он создается, а на другой странице, когда вы запускаете сеанс, присутствуют переменные: -
HaRsH

@HaRsH Оо? Session_regenerate_id удаляет старый идентификатор сеанса и создает новый, например, чтобы избежать перехвата сеанса с помощью XSS. Это не влияет на видимость переменных SESSION в других документах.
Xatenev 09

да, я знаю, что не имею никакого влияния на другие переменные, но если вы не запускаете сеанс на этой странице, переменная не присутствует на этой странице в основном php
HaRsH 09

1
Но речь идет о session_regenerate_id, а не о session_start ...
Xatenev 09

1
Я бы посоветовал прочитать RFC, где это было предложено: wiki.php.net/rfc/precise_session_management
jankal

Ответы:


96

Что есть session_regenerate_id()?

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

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

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

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

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

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

Дальнейшее чтение:


2
А что прибавляет, если хакер делает 20-й звонок? Идентификатор сеанса изменен, и он единственный владеет сеансом;))
fred727

@ fred727 Если хакеру посчастливится попасть на 20-й вызов, то у пользователя будет неверный идентификатор, и он больше не будет аутентифицирован. Без регенерации аутентифицировались бы и хакер, и пользователь.
Bradmage

также может быть полезно вызвать session_regenerate_id при хранении конфиденциальной информации в сеансах (не только при аутентификации)
Адам

Можно ли зафиксировать сеанс, если информации о сеансе нет в файле cookie? Я храню информацию о сеансе в файлах на моем сервере, необходимо ли восстанавливать идентификатор?
Gonzalo

«для фиксации (установки) идентификатора сеанса (SID) другого пользователя» .... это следует заменить на «для фиксации (установки) идентификатора сеанса (SID) на компьютере другого пользователя, а затем использовать его после его аутентификации. »
Бухгалтер م

25

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

Из этого Security.SE ответ :

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

С этой веб-страницы :

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

Когда использовать

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

Смотрите также:

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

Фиксация сеанса (Хорошее чтение)


22

Думаю, проблема отравления сеансов освещена достаточно хорошо.

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

Что бы они выиграли, если бы кто-то провел это занятие?

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

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

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


2
HTTPS ничего не меняет по фиксации.
kelunik

4
Но это действительно усложняет атаки сниффинга, которые можно использовать, в первую очередь, для получения идентификатора сеанса.
demonkoryu

мое приложение php выходит из системы в течение нескольких секунд, я использую регенерацию, есть ли ограничение на файлы сеанса, которые могут быть созданы, или есть ограничение на восстановленные идентификаторы, которые могут вызвать выход?
sqlchild

В общем, нет. Возможно, вы захотите задать об этом отдельный вопрос
Machavity

17

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

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

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

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

пример

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

Как теперь украсть сеанс?

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

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


Но до того момента, когда session_regenerate_id()выдадут, Алиса сможет получить доступ к учетной записи bobs? это правильно?
Акам

2
@akam - Уже поздно, но стоит ответить ... 1. Боб не выходит из системы, Алиса может использовать свой логин - 2. Боб выходит из системы, Алиса не входит в систему, Алиса может использовать свой идентификатор сеанса, но нет активного входа в систему для доступа к его данным - 3. Боб выходит из системы, Алиса входит в систему, Боб использует идентификатор сеанса, есть активный вход в систему, Боб получает доступ к данным Алисы. Но чтобы быть конкретным: в зависимости от безопасности сценариев идентификатор сеанса не обязательно означает, что вы можете получить доступ к данным вышедшего из системы пользователя, но, как правило, это возможно и с высоким риском.
codekandis

15

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

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

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

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

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

session_start();
session_regenerate_id();

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

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

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

у пользователя есть sessionid = 4 // авторизация

у хакера есть сессия = 3 // null

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

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

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

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


12

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

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

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

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

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

// 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();

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


4

session_regenerate_id (): невозможно восстановить идентификатор сеанса - сеанс не активен

if(session_status() == PHP_SESSION_ACTIVE)
{
    session_regenerate_id();
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.