Сеансы PHP с отключенными файлами cookie, это работает?
Сегодня у меня было собеседование по скайпу для работы в качестве разработчика PHP, один из заданных вопросов касался файлов cookie и сеансов PHP.
Вопрос заключался в том, можно ли установить и прочитать сеанс PHP, использовать, если файлы cookie отключены в браузере пользователя?
Я сказал им, что нет, потому что сеансы PHP по умолчанию зависят от установки файла cookie сеанса. Когда начинается сеанс PHP, новый файл cookie сеанса устанавливается с именем по умолчанию PHPSESSID, и этот файл cookie содержит значение этого идентификатора сеанса, например: ftu63d8al491s5gatuobj39gk7 Затем на сервере apache в папке tmp создается файл sess_ftu63d8al491s5gatuobj39gk7, который содержит содержимое этого сеанса, например: test1|s:12:"sessiontest1"; test2|s:12: "sessiontest2";
Они сказали мне, что это неправда, и что вы можете использовать сеансы PHP, даже если пользователь отключает файлы cookie в своем браузере.
Затем я сказал им, что вы можете это сделать, но тогда идентификатор сеанса будет передан через URL как переменная GET. И это небезопасно, и вы должны это настроить в php.ini.
Они говорили о том, как вы можете использовать сеансы PHP, даже если файлы cookie отключены в браузере. А что, если мы создаем интернет-магазин, а какая-нибудь бабуля использует наш интернет-магазин и отключает файлы cookie, и ей все равно. И что сеансы PHP великолепны, потому что вы можете использовать их, даже если пользователь отключает файлы cookie. Я был как wtf, wtf wtf?!?!
Я провел тест с двумя файлами, index.php запускает сеанс и устанавливает переменные сеанса. А потом session.php пытается прочитать этот сеанс переменные.
Вот как это выглядит:
Index.php
<p>This is where I start and set php sessions.</p>
<?php
session_start();
$_SESSION['test1'] = "SessionTest1";
$_SESSION['test2'] = "SessionTest2";
?>
<p>This is a link, that starts new HTTP Request, and tries to read session set on this page:</p>
<p><a href="session.php">Read Session</a></p>
Session.php
<?php
session_start();
var_export($_SESSION);
?>
<p><a href="index.php">Back</a></p>
Теперь, если вы включили файлы cookie в своем браузере, посетите index.php, и визит session.php , сеанс будет распечатан.
Но, если вы очистите историю своего браузера и файлы cookie, а затем посетите index.php, а затем посетить session.php, вы бы увидели пустой массив, верно?
Итак, в основном мой вопрос заключается в том, прав ли я? Можете ли вы использовать сеансы PHP, если вы отключите файлы cookie в своем браузер? И механизм сеанса PHP по умолчанию зависит от настройки файла COOKIE сеанса?
Обновление: Я сходил по этому поводу с ума, поэтому перезвонил парню, с которым разговаривал. И спросил его, может ли сеанс PHP работать без файлов cookie по умолчанию? Парень сказал "да". Тогда я сказал ему, что он ошибается, и он сказал: "Да, да, если ты так говоришь..." и начал смеяться. Затем я сказал ему, хорошо, если сеанс PHP может работать без установки cookie, как сервер узнает идентификатор текущего сеанса пользователя/браузера, если он не хранится в файл cookie сеанса? (Я хотел посмотреть, знает ли он, что идентификатор сеанса может быть передан как переменная GET) И он молчал, по крайней мере, 20 секунд, и сказал мне, что он Системный администратор, и что я должен спросить этого парня-разработчика. И что ему 43 года и у него огромный 13-летний опыт работы в бизнесе (он начинал с 30? wtf?), но в этом он мне доверяет. И я объяснил ему, как работает сеанс и что вы можете использовать его без файлов cookie, но затем идентификатор сеанса передается как переменная GET, и сказал ему, что я сказал им это на собеседовании, но они сказали мне "нет, нет, нет"... :S
Таким образом, в принципе, парень понятия не имел о PHP и сеансах PHP, и да, он был тем, кто спрашивал меня о сеансах, говоря мне, что сеанс PHP может работать без файлов cookie, даже когда я сказал ему, что это невозможно сделать, и что есть способ использовать сеансы PHP без файлов cookie, но по умолчанию он не будет работать. Он сказал: "Нет, нет, нет"... В конце он сказал мне, что, по его мнению, сеансы могут работать без файлов cookie, потому что он, как системный администратор на своих серверах, никогда не сможет видеть сеансы в папке tmp?!?!?
В любом случае, эти ребята отстой в PHP, я ни за что не приму от них предложение о работе, и после всего этого я не думаю, что они все равно предложат мне работу...
Спасибо за все комментарии!
9 answers
"Посетителю, заходящему на ваш веб-сайт, присваивается уникальный идентификатор, так называемый идентификатор сеанса. Это либо сохраняется в файле cookie на стороне пользователя , либо распространяется по URL-адресу"
.
Если session.use_cookies = 1 (Файл cookie включен.)
Если session.use_cookies =0 (Cookie отключен.)
Если session.use_cookies = 1, то session сохраняет идентификатор сеанса в файле cookie. Вызов session_id() позволяет получить сохраненный идентификатор сеанса из файла cookie, и сохраненные данные в массиве сеансов будут найдены на всех страницах. Если session.use_cookies = 0, в этом случае сеанс не сохраняет идентификатор сеанса в файле cookie, и вы будете получать каждый раз новый идентификатор сеанса, используя session_id() и данные сохраненные в сеансе на других страницах, не будут найдены на других страницах.
Да, сеанс будет работать, если файлы cookie отключены. Но сначала apache проверяет настройки конфигурации php. Например:
--enable-trans-sid
and
--enable-track-vars
Если это значение равно true, сеанс будет автоматически передан по ПОЧТЕ.
Если значения "--enable-trans-sid" и "--enable-track-vars" имеют значение FALSE, нам необходимо передать идентификатор сеанса с помощью константы SID.
< a href="index.php?<?= SID ?>" >Navigate from here< /a >
Необходимо установить php.ini
ini_set("session.use_cookies", 0);
ini_set("session.use_trans_sid", 1);
Итак, в основном мой вопрос заключается в том, прав ли я?
В основном. В реальном мире: ДА.
Можете ли вы использовать сеансы PHP, если отключите файлы cookie в своем браузере?
Вы МОЖЕТЕ использовать сеансы PHP без файлов cookie, при условии, что идентификатор браузера каким-либо образом получен и дает уникальное значение (и это значение передается на уровень сеанса PHP):
- идентификатор сеанса в GET (что является "стандартным" способом PHP, если файлы cookie не разрешено, и "другим" способом, который вы описали). Это значение затем автоматически распространяется PHP, например, добавляется ко всем HREF и так далее. Если он не распространяется из-за сбоя автоматического распознавания ссылок (например, сложный URL, встроенный в Javascript), вы несете ответственность за предоставление соответствующих данных.
Или - и вот мы уже не в Канзасе:
- передано среди nonces с дайджестом аутентификации (это грязный трюк и, конечно, требует, чтобы весь сайт был за схемой аутентификации доступа с авторизацией. И вы больше не можете использовать "фиктивную аутентификацию" (т.Е. http://welcome:[email protected] ) потому что некоторые браузеры, например Internet Explorer, больше не поддерживают их по соображениям безопасности)
- распознавание браузера каким-либо другим способом ("снятие отпечатков пальцев") ( обычно это (1) самоубийство)
- Используйте LSO (Локальные общие объекты) для генерации случайного идентификатора UUID, если его еще нет, и сохраните его, чтобы он мог быть извлекается при последующих обращениях.
- другие способы (см. http://en.wikipedia.org/wiki/Evercookie )
(1) если бы вы находились в локальной сети, где вы можете доверять IP-адресам, вы могли бы связать "сеанс" с IP-адресом пользователя. Вы можете применять строгую политику "без файлов cookie" в небольшой фирме и по-прежнему проводить сеансы с пользователями, не прибегая к _GET/_POST для вашего идентификатора сеанса.
Если бы это был я, я бы сказал "Да"
Так как вы могли бы сохранить сеанс в форме/URL-адресе где-нибудь, чтобы перейти на следующую страницу (очень плохая идея). Итак, основываясь на его вопросе "можно ли установить и прочитать сеанс PHP, использовать, если файлы cookie отключены в браузере пользователя?"
Тогда это должно быть "да". Его можно читать и использовать.
Однако, если пользователь закроет браузер, то он исчезнет, и все. (так как этот парень не спрашивал об этой части)
Да.. Это будет работать
1.PHP передаст один параметр GET в URL с именем PHPSESSID, но его можно изменить session.name в файле php.ini.
2. Он добавляет один скрытый ввод в формы с тем же именем.
Вам нужно будет указать идентификатор сеанса в URL-адресе. Вам нужно будет внести изменения в свой файл php.ini, поэтому, если вы находитесь на общем хостинге, вам нужно будет связаться с ними, чтобы узнать, что они сделают для вас.
Вы правы, сеанс не может работать без файлов cookie. Чтобы проиллюстрировать это, попробуйте выполнить следующие действия.
- Войдите В Gmail.
- После входа в систему отключил файлы cookie.
- Обновите страницу.
Вы снова будете перенаправлены на страницу входа в систему, так как сервер не может идентифицировать сеанс.
- Теперь снова включите файлы cookie.
- Обновите страницу. (Примечание: Не нажимайте на кнопку входа в систему).
- Вы будете автоматически перенаправлены на Почтовый ящик Gmail.
Следовательно, мы можем сказать, что без файлов cookie сеанс не будет работать.
Кроме того, если вы пытаетесь войти в gmail (в качестве примера вы можете взять любой веб-сайт) с помощью файлов cookie, то появится сообщение " В вашем браузере отключены файлы cookie. Убедитесь, что ваши файлы cookie включены, и повторите попытку."
Я думаю, что есть третий способ хранения сеансов HTML5! Что, если мы сохраним данные сеанса вручную на сервере и получим всю настроенную страницу с помощью AJAX на основе идентификатора сеанса, хранящегося в хранилище сеансов?
Проблема в том, что хранилище сеансов также может быть отключено: https://stackoverflow.com/a/25050910/8460132