Как отключить 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>