Как отключить PHP сессии cookie?

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

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

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

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

7 ответов

Решение

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

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

SetEnv session.use_cookies='0';

Используйте ini_set ():

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

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

session.use_cookies = 0

Если вам просто нужно иметь возможность убрать сессию в определенное время, используйте 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();

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

Например.

php_value session.use_cookies 0

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

// 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)

Если вы находитесь в настройке с сеансом / заголовком, уже определенным из другого местоположения приложения, вы также можете удалитьSet-CookieЗаголовок HTTP с этим блоком кода

      header_remove("Set-Cookie");

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

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

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>
Другие вопросы по тегам