Перехват сеанса PHP

Возможный дубликат:
фиксация/перехват сеанса PHP

Я много и интенсивно использую $_SESSION superglobal.

Однако ситуация такая:

После того, как пользователь зарегистрирован, я хочу отслеживать его идентификатор (таблица MySQL). Я могу легко вставить идентификатор в $_SESSION['id'] = $user_id;

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

Достаточно ли session_regenerate_id() для защиты моего сеанса от взлома?

Вывод: Cookie хранит только идентификатор сеанса — все значения находятся на сервере и никогда не передаются на сторону клиента. Прочитайте о фиксации/перехвате сеанса на StackOverflow


person lukas.pukenis    schedule 17.10.2011    source источник
comment
С чего вы взяли, что переменные, хранящиеся в $_SESSION, отправляются клиенту?   -  person Chris Eberle    schedule 17.10.2011
comment
Ничего такого. Я считаю, что внутри файла cookie на стороне клиента есть только какой-то хеш, который работает в сотрудничестве с $_SESSION. Возможно, я неправильно записал свой вопрос - я обновлю.   -  person lukas.pukenis    schedule 17.10.2011


Ответы (3)


У пользователя нет доступа к $_SESSION['id']. Он не может изменять переменную, хранящуюся на вашем сервере (см. документ session).

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

person mario    schedule 17.10.2011
comment
Извините.. Я понимаю, что $_SESSION находится на стороне сервера, но сеансы работают с файлами cookie на стороне клиента - каким-то образом данные должны передаваться из браузера на сервер для сеанса. Я думаю, это называется перехватом сеанса? - person lukas.pukenis; 17.10.2011
comment
Браузер передает только файл cookie SID. Содержащаяся переменная ["id"] хранится на сервере. - person mario; 17.10.2011
comment
Пожалуйста, прочитайте Фиксация/захват сеанса PHP - person mario; 17.10.2011
comment
Спасибо - кажется, это идеальный URL, который я искал - person lukas.pukenis; 17.10.2011
comment
Имеет смысл использовать только... - ерунда - его следует всегда использовать при аутентификации или там, где вы можете обнаружить сеанс с истекшим сроком действия, чтобы предотвратить атаки фиксации - person symcbean; 17.10.2011

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

person Tyler Ferraro    schedule 17.10.2011

Одним из вариантов было бы хэшировать его, а затем использовать тот же хэш в вашей базе данных.

Пример:

$_SESSION['id'] = md5($user_id);

$query = "SELECT * from database_table where md5(database_table.user_id) = " . $_SESSION['id'];
person Atticus    schedule 17.10.2011
comment
Спасибо! Я использовал такой метод раньше. Но теперь я хотел бы знать его недостатки. - person lukas.pukenis; 17.10.2011
comment
@KendallHopkins упс, это правда - person Atticus; 17.10.2011
comment
@ Аттикус, ты имеешь в виду md5 (md5 ($ user_id)) == $ user_id ? - person Imran Naqvi; 17.10.2011
comment
@ImranNaqvi упс, нет, я имел в виду MD5 для столбца в SQL, проверьте новый скрипт - person Atticus; 18.10.2011