Подтвердить что ты не робот

Как точно работает захват сеансов в PHP?

поэтому я создал сайт, на котором есть регистрация/логин. Я вижу файл cookie PHPSESSID в инструментах разработчика Chrome, поэтому мне интересно, как я могу использовать это значение идентификатора сеанса для захвата учетной записи, которую я зарегистрировал, от того, чтобы сказать другой браузер, для простоты? Должен ли безопасный веб-сайт определять, что этот сеанс был захвачен и предотвратить его? Кроме того, почему другие большие сайты, использующие PHP (т.е. Facebook), не имеют файлов PHPSESSID? Означают ли они другое имя для неясности или просто используют совсем другой механизм?

4b9b3361

Ответ 1

Много хороших вопросов, и хорошо для вас, чтобы спросить их.

Сначала.. сеанс - это всего лишь куки. "Сессия" не является частью HTTP-стека. PHP просто предоставляет некоторые удобства, которые облегчают работу с куки файлами, тем самым вводя сеансы. PHP выбирает PHPSESSID в качестве имени по умолчанию для файла cookie, но вы можете выбрать любой, который вы хотите. Даже в PHP вы можете изменить имя session_name.

Все, что нужно злоумышленнику, это захватить куки файлы сеанса, которые вы просматриваете, и использовать его в своем собственном браузере. Злоумышленник может сделать это с помощью автоматических сценариев или, например, с помощью firebug, вы можете просто изменить текущие значения файлов cookie.

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

Однако самая сложная часть для злоумышленника - это получение файла cookie в первую очередь. Нападающий не может этого сделать, если:

  • У них есть доступ к вашему компьютеру.
  • Они каким-то образом могут отслеживать ваш сетевой трафик.

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

Вы можете исправить второй, убедившись, что весь ваш трафик зашифрован с помощью HTTPS. Есть очень мало причин не использовать HTTPS. Если у вас есть зона входа в систему на вашем сайте, используйте SSL!!

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

  • Всякий раз, когда пользователь входит в систему, дайте им новый идентификатор сеанса
  • Всякий раз, когда пользователь выходит из системы, также дайте им новый идентификатор сеанса!
  • Убедитесь, что браузер ни при каких обстоятельствах не может определить значение cookie сеанса. Если вы не узнаете cookie, восстановите новый!

Ответ 2

Если вы используете один и тот же IP-адрес и используете один и тот же браузер, все, что вам нужно сделать, это дублировать идентификатор сеанса (и, возможно, другие значения cookie: не совсем уверен, отслеживаются или сравниваются конкретные вещи браузера, такие как его строка агента; это зависит от реализации).

В общем, есть разные способы отслеживания пользователей (в конце концов это просто отслеживание пользователей). Например, вы можете использовать cookie или некоторое скрытое значение внутри веб-страницы. Вы могли бы также использовать значение в HTTP GET-запросах, флэш-cookie или какой-либо другой метод аутентификации (или их комбинацию).

В случае Facebook они используют несколько значений cookie, поэтому я просто предполагаю, что они используют одно из этих значений (например, "xs" ).

В целом, нет реального 100% безопасного способа сделать это (например, из-за атак типа "человек в середине" ), но в целом я бы сделал следующее:

  • После входа в систему сохраните IP-адрес пользователя, его строку агента браузера и уникальный токен (отредактируйте из-за вышеприведенного комментария: вы также можете пропустить его IP-адрес, делая все это менее безопасным).
  • Клиентская сторона хранит уникальный идентификатор пользователя (например, идентификатор пользователя) и этот токен (в файле cookie или GET).
  • Пока данные, сохраненные на первом шаге, совпадают, это тот же пользователь. Чтобы выйти из системы, просто удалите токен из базы данных.

О, и просто упомянуть это: все это не специфично для PHP. Они могут выполняться с любого языка на стороне сервера (Perl, PHP, Ruby, С#,...) или сервера в целом.

Ответ 3

Кто-то нюхает cookie идентификатора сеанса и устанавливает его для последующего запроса. Если это единственное, что аутентифицировало пользователя, они вошли в систему.

Большинство сайтов будут использовать аутентификацию на основе файлов cookie в той или иной форме. Существует несколько способов сделать это более безопасным, например, хранить информацию о браузере пользователя при входе в систему (например, пользовательский агент, IP-адрес). Если кто-то еще наивно пытается скопировать файл cookie, это не сработает. (Конечно, есть способы обойти это тоже.) Вы также увидите периодические обновления cookie сеансов, чтобы убедиться, что они недействительны в течение очень долгого времени.

Откроется Firesheep для расширения Firefox, которое выполняет захват сеанса. Я не предлагаю вам использовать его, но вы можете найти обсуждение на этой странице интересным.