2013-12-16 2 views
0

Мне нужно хранить отдельные куки для отдельных каталогов на моем сайте. Я прочитал несколько статей о том, как это можно сделать, но я не смог найти решение для меня. Я выполнить одну из этих строк на каждой странице (COOKIE_PATH = '/city_dir/'):Различные cookie сеанса для разных путей

session_set_cookie_params($lifetimeSeconds, COOKIE_PATH); 

или

session_save_path(COOKIE_PATH); 

Последовал:

if (isset($_COOKIE['PHPSESSID'])){ 
    $data = $_COOKIE['PHPSESSID']; 
    $timeout = time() + $lifetimeSeconds; 
    session_start(); 
    setcookie('PHPSESSID', $data, $timeout); 
} 
else { 
    session_start(); 
} 
session_regenerate_id(true); 

Первая линия (session_set_cookie_params) звучало как правильное решение , но когда я использую эту строку, никакие файлы cookie не отображаются вообще в списке инструментов веб-разработчика Chrome, и я не могу войти на сайт.

Вторая строка не похожа на правильное решение (кажется, я должен иметь дело с пустым файлом, а не с контуром сохранения), но он приближается. При первой загрузке страницы я вижу cookie для пути «/». Если я обновляю страницу, этот файл cookie останется, и файл cookie указан для пути COOKIE_PATH. К сожалению, я все еще не могу войти в систему. Я искал и пробовал много вариантов на всех выходных, но не мог заставить ничего работать. Что мне не хватает? Я использую PHP версии 5.3.18.

+0

[session_save_path()] (http://php.net/session_save_path) не имеет ничего общего с куки-файлами; он устанавливает каталог сервера, где материал хранится. На самом деле, я не могу понять актуальность вашего кода после 'session_set_cookie_params()'. Вероятно, проблема состоит в том, что: 1) 'COOKIE_PATH' содержит недопустимый путь (вы не говорите это явно, но вы предлагаете отказаться от ведущей косой черты). 2) Вы также используете сеансы в корне вашего сайта –

+0

' session_set_cookie_params' должно сработать. У меня есть рабочая реализация, которая делает именно то, что вы описываете. Дважды проверьте свои предположения. Сессия началась? Вы видите, что сеанс создается на сервере? Получаете ли вы сеанс cookie? – Halcyon

+0

Иногда браузеры могут показать странное поведение, если у вас есть cookie сеанса для родительского пути; они отправят неправильный файл cookie. Очистите файлы cookie, чтобы убедиться, что вы не сталкиваетесь с этой проблемой. – Halcyon

ответ

1

Мне нужно хранить отдельные куки для отдельных каталогов на моем сайте

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

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

Вы вводите в заблуждение путь к файлу cookie и путь обработчика сеанса в своем вопросе.

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

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

+0

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

+0

Я знаю действительный прецедент, но ваш не похоже на один. Добавьте город к запросу другим способом, например request-url. Это также делает его действительно очевидным для пользователя, в каком городе он работает. – Halcyon

+0

@Frits van Campen: одно требование, которое заставляет меня полагать, что мне нужен отдельный сеанс для каждого города, заключается в том, что мой клиент теперь хочет отслеживать, когда каждый пользователь входит в систему и выходит из каждого города. Кроме того, у одного и того же пользователя могут быть разные разрешения для разных городов. – ctrane

0

session_save_path() предназначен для определения места хранения файлов cookie на сервере, и я не уверен, что это то, что вам нужно.

В документации setcookie() указан еще один параметр path, который может быть полезен, если ваш «путь» действительно является частью URL-адреса после порта, используемого для доступа к сценарию.

Я бы не играл с PHPSESSID, потому что он используется для отслеживания сеансов пользователей, и довольно необычно иметь разные сеансы на одном хосте.

-1

Вы, кажется, делаете это сложнее, чем должно быть.Сайт может устанавливать много файлов cookie в браузере клиента, но они не следуют структурам каталогов.

Что вы хотите сделать что-то вроде:

setcookie('Akron',$data_about_akron,time() + (86400 * 7)); // 86400 = 1 day 
setcookie('Boston',$data_about_boston,time() + (86400 * 7)); // 86400 = 1 day 

, а затем получить его с помощью:

$data_about_akron = $_COOKIE['Akron']; 
+0

@FritsvanCampen прочитал вопрос, прежде чем вы топаете вокруг опроса каждого. Он злоупотребляет сессионными варами в попытке установить разные куки. Его FIRST SENTENCE: «Мне нужно хранить отдельные файлы cookie для отдельных каталогов на моем сайте». Однако я согласен, что беспорядок с файлом cookie PHPSESSID плох ... –

+0

Я думаю, что это открыто для интерпретации (в сеансах используется файл cookie).Поскольку он говорит о логине, он, вероятно, хочет сеанса, поскольку файлы cookie не безопасны. Там есть и другие проблемы с вашим ответом. 'setcookie' имеет параметр $ path. Я попрошу уточнить, что находится в '$ data_about_akron', прежде чем отправлять ответ. – Halcyon

+0

@ Digital Chris Мне нужны отдельные файлы cookie для хранения идентификатора сеанса для каждого входа пользователя для каждого города. Кроме того, структура каталогов актуальна в том случае, когда пользователь находится в определенном городском каталоге, я хочу использовать файл cookie (то есть идентификатор сеанса), который соответствует этому городу (например, когда на сайте site.com/akron можно получить файл cookie названный «akron» - если я изменю url на site.com/boston, им нужно будет войти в систему boston, и тогда будет создан новый сеанс «boston» и cookie, который будет включать их разрешения для boston). – ctrane

0

Добавление имени сеанса дал мне функции я искал (слегка испытано) :

session_name($cookieName); 
session_set_cookie_params($lifetimeSeconds, $cookiePath); 

С помощью этого кода нет файлов cookie PHPSESSID, только названного файла cookie.

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

@Frits van Campen: Одно требование, которое заставляет меня полагать, что мне нужен отдельный сеанс для каждого города, заключается в том, что мой клиент теперь хочет отслеживать, когда каждый пользователь входит в систему и выходит из каждого города. Кроме того, у одного и того же пользователя могут быть разные разрешения для разных городов.

Итак, если это плохой подход, почему это плохо (безопасность, ремонтопригодность и т. Д.)? Каковы другие варианты (я могу только придумать переход к субдоменам).

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