Как отключить PHP сессии cookie? - PullRequest
9 голосов
/ 28 октября 2008

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

PHP автоматически устанавливает куки, где это возможно. Я узнал, что можно изменить это поведение, установив session.use_cookies в 0 в php.ini. К сожалению, у меня нет доступа к этому файлу, и я также не хотел бы нарушать поведение других скриптов, работающих на том же сервере.

Есть ли способ отключить или аннулировать cookie-файл сеанса внутри скрипта PHP?

РЕДАКТИРОВАТЬ: Поскольку предложенные решения не работают для меня, я использовал $ _SESSION = array () в позициях кода, где я обнаружил, что сессия должна быть недействительной.

Ответы [ 6 ]

31 голосов
/ 28 октября 2008

Использовать ini_set () :

ini_set('session.use_cookies', '0');

Или в вашем файле php.ini:

session.use_cookies = 0
7 голосов
/ 28 октября 2008

ошибка позволяет переопределить настройки по умолчанию вашего хоста, создав собственный файл .htaccess, и вот отличный учебник, если вы еще не коснулись этого http://www.askapache.com/htaccess/apache-htaccess.html

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

SetEnv session.use_cookies='0';
2 голосов
/ 28 октября 2008

Если вам просто нужно иметь возможность убрать сессию в определенное время, используйте session_destroy (). Если вы хотите полностью завершить сеанс, вот фрагмент кода / вставленный прямо из документации:

// Initialize the session.
// If you are using session_name("something"), don't forget it now!
session_start();

// Unset all of the session variables.
$_SESSION = array();

// If it's desired to kill the session, also delete the session cookie.
// Note: This will destroy the session, and not just the session data!
if (isset($_COOKIE[session_name()])) {
    setcookie(session_name(), '', time()-42000, '/');
}

// Finally, destroy the session.
session_destroy();
2 голосов
/ 28 октября 2008

Вы также можете поместить этот параметр в .htaccess, чтобы он применялся ко всем сценариям, в противном случае вам необходимо убедиться, что код вызывается при каждом запросе.

Например.

php_value session.use_cookies 0

1 голос
/ 08 января 2012

У меня возникли проблемы с документированным подходом PHP к уничтожению сеанса без файлов cookie.

// If it's desired to kill the session, also delete the session cookie.
// Note: This will destroy the session, and not just the session data!
if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
    );
}

Это привело к тому, что я увидел, что файл cookie установлен дважды:

Set-Cookie: SESSION_NAME=deleted; expires=Sat, 08-Jan-2011 14:09:10 GMT; path=/; secure
Set-Cookie: SESSION_NAME=1_4f09a3871d483; path=/

Как указано в комментариях PHP, установка значения cookie, отличного от пустого (''), избавляет от значения "удалено", но второй набор файлов cookie остается.

Чтобы избавиться от этого, мне пришлось добавить код, предложенный выше:

ini_set('session.use_cookies', '0');

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

Я тестировал на Mac: PHP 5.3.6 с Suhosin-Patch (cli) (сборка: 8 сентября 2011 19:34:00)

0 голосов
/ 28 октября 2008

Способ сделать это - настроить сеансы самостоятельно.

В центральном включаемом файле, который включают все остальные ваши файлы (у вас есть один из них, верно?), Вам нужно сделать несколько вещей как можно раньше.

if( !array_key_exists('sessionid', $_POST) ) {
    // recreate the sessionid
    $sessionid = md5(rand().' '.microtime()); // Or something
} else {
    $sessionid = $_POST['sessionid'];

session_id($sessionid);
session_start();

Теперь вы должны помнить, что как только вы запустите форму, вам нужно будет указать:

<input type='hidden' name='sessionid'><?= session_id() ?></input>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...