2010-11-26 4 views
2

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

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

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

Сценарий создает идентификатор сеанса, привязанный к машине пользователя, и остается неизменным во всем. Я думал о том, чтобы включить текущую дату в хеш, но наши ночные рабочие перейдут в полночь. Не то, чтобы я был рядом, чтобы услышать их жалобы;)

Я понимаю, что использование IP-адреса открывает его для злоупотребления, если два пользователя с той же ОС и браузером сидят в кафе, используя бесплатный Wi-Fi, но это для внутренней MIS, поэтому каждый пользователь будет иметь свой собственный статический IP-адрес. Если они решат позже сделать доступным из Интернета, у меня проблемы! Но это не было частью спецификации :)

// Set the session ID 
$session_hash = md5($_SERVER['HTTP_USER_AGENT'] . $_SERVER['REMOTE_HOST'] . $_SERVER['REMOTE_ADDR']); 
// Compare against session ID received from user 
if (session_id() != $session_hash) 
{ 
    session_destroy(); 
    unset ($_SESSION); 
    session_id($session_hash); 
    session_start(); 
} 
else 
{ 
    // Attempt to load user details from database if $_SESSION['user_ID'] is set. 
} 

Все конструктивные комментарии приветствовали и оценили!

ответ

7

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

Используйте встроенные сеансы PHP, если не найдете конкретных причин, чтобы избежать их. Вы не указали, что у вас есть такая причина. Совсем наоборот, как вы говорите, система предназначена для внутреннего использования, когда ваша домашняя «улучшенная» безопасность сеанса еще менее важна.

На самом деле не имеет значения, что вы делаете, скорее всего, вы уменьшите безопасность того, что PHP уже предоставляет вам, пытаясь катиться самостоятельно.

+0

И я подумал, что я все умный. Я полностью понимаю вашу точку зрения, но думал, что встроенные сессии PHP не были такими безопасными. – Kalessin 2010-11-27 11:33:55

1

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

2

Если все они имеют свой собственный статический IP-адрес, храните IP-адрес в сеансе и сравнивайте каждый раз, когда загружается страница. Если $_SERVER['REMOTE_ADDR'] != $_SESSION['IP'], кто-то пытается украсть сеанс.

И не забывайте session_regenerate_id().

Смежные вопросы